...

Source file src/oss.terrastruct.com/d2/lib/urlenc/urlenc.go

Documentation: oss.terrastruct.com/d2/lib/urlenc

     1  package urlenc
     2  
     3  import (
     4  	"bytes"
     5  	"compress/flate"
     6  	"encoding/base64"
     7  	"io"
     8  	"strings"
     9  
    10  	"oss.terrastruct.com/util-go/xdefer"
    11  )
    12  
    13  // Encode takes a D2 script and encodes it as a compressed base64 string for embedding in URLs.
    14  func Encode(raw string) (_ string, err error) {
    15  	defer xdefer.Errorf(&err, "failed to encode d2 script")
    16  
    17  	b := &bytes.Buffer{}
    18  
    19  	zw, err := flate.NewWriterDict(b, flate.BestCompression, nil)
    20  	if err != nil {
    21  		return "", err
    22  	}
    23  	if _, err := io.Copy(zw, strings.NewReader(raw)); err != nil {
    24  		return "", err
    25  	}
    26  	if err := zw.Close(); err != nil {
    27  		return "", err
    28  	}
    29  
    30  	encoded := base64.URLEncoding.EncodeToString(b.Bytes())
    31  	return encoded, nil
    32  }
    33  
    34  // Decode decodes a compressed base64 D2 string.
    35  func Decode(encoded string) (_ string, err error) {
    36  	defer xdefer.Errorf(&err, "failed to decode d2 script")
    37  
    38  	b64Decoded, err := base64.URLEncoding.DecodeString(encoded)
    39  	if err != nil {
    40  		return "", err
    41  	}
    42  
    43  	zr := flate.NewReaderDict(bytes.NewReader(b64Decoded), nil)
    44  	var b bytes.Buffer
    45  	if _, err := io.Copy(&b, zr); err != nil {
    46  		return "", err
    47  	}
    48  	if err := zr.Close(); err != nil {
    49  		return "", nil
    50  	}
    51  	return b.String(), nil
    52  }
    53  

View as plain text