deflate64.go (1658B)
1 // Compress and encode, or decode and decompress 2 // with base64 and deflate (zlib). 3 // This can be useful for sending any data as text, 4 // and it's the format used by kroki (https://kroki.io/). 5 6 package main 7 8 import ( 9 "bufio" 10 "bytes" 11 "compress/zlib" 12 "encoding/base64" 13 "fmt" 14 "io" 15 "os" 16 ) 17 18 // Encode takes a string and returns an encoded string in deflate + base64 format 19 // (stolen from https://docs.kroki.io/kroki/setup/encode-diagram/#go) 20 21 func Encode(input string) (string, error) { 22 var buffer bytes.Buffer 23 writer, err := zlib.NewWriterLevel(&buffer, 9) 24 if err != nil { 25 return "", fmt.Errorf("failed to create the writer: %w", err) 26 } 27 _, err = writer.Write([]byte(input)) 28 writer.Close() 29 if err != nil { 30 return "", fmt.Errorf("fail to create the payload: %w", err) 31 } 32 result := base64.URLEncoding.EncodeToString(buffer.Bytes()) 33 return result, nil 34 } 35 36 func Decode(zippedB64 string) (string, error) { 37 result, err := base64.URLEncoding.DecodeString(zippedB64) 38 if err != nil { 39 return "", fmt.Errorf("failed to decode base64: %w", err) 40 } 41 rbuf := bytes.NewReader([]byte(result)) 42 r, err := zlib.NewReader(rbuf) 43 if err != nil { 44 return "", fmt.Errorf("failed to create the reader: %w", err) 45 } 46 var buf bytes.Buffer 47 _, err = io.Copy(bufio.NewWriter(&buf), r) 48 return buf.String(), err 49 } 50 51 func main() { 52 if len(os.Args) < 3 { 53 fmt.Printf("Use: %v [encode|decode] <input>", os.Args[0]) 54 os.Exit(1) 55 } 56 var result string 57 var err error 58 switch os.Args[1] { 59 case "decode": 60 result, err = Decode(os.Args[2]) 61 default: 62 result, err = Encode(os.Args[2]) 63 } 64 if err != nil { 65 fmt.Println("error:", err) 66 } else { 67 fmt.Println(result) 68 } 69 }