d2/lib/urlenc/urlenc.go
2023-11-07 11:39:24 -08:00

52 lines
1.1 KiB
Go

package urlenc
import (
"bytes"
"compress/flate"
"encoding/base64"
"io"
"strings"
"oss.terrastruct.com/util-go/xdefer"
)
// Encode takes a D2 script and encodes it as a compressed base64 string for embedding in URLs.
func Encode(raw string) (_ string, err error) {
defer xdefer.Errorf(&err, "failed to encode d2 script")
b := &bytes.Buffer{}
zw, err := flate.NewWriterDict(b, flate.BestCompression, nil)
if err != nil {
return "", err
}
if _, err := io.Copy(zw, strings.NewReader(raw)); err != nil {
return "", err
}
if err := zw.Close(); err != nil {
return "", err
}
encoded := base64.URLEncoding.EncodeToString(b.Bytes())
return encoded, nil
}
// Decode decodes a compressed base64 D2 string.
func Decode(encoded string) (_ string, err error) {
defer xdefer.Errorf(&err, "failed to decode d2 script")
b64Decoded, err := base64.URLEncoding.DecodeString(encoded)
if err != nil {
return "", err
}
zr := flate.NewReaderDict(bytes.NewReader(b64Decoded), nil)
var b bytes.Buffer
if _, err := io.Copy(&b, zr); err != nil {
return "", err
}
if err := zr.Close(); err != nil {
return "", nil
}
return b.String(), nil
}