snippets

More or less useful code snippets
Log | Files | Refs

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 }