d2/lib/urlenc/urlenc.go

53 lines
1.1 KiB
Go
Raw Permalink Normal View History

package urlenc
2022-11-26 03:22:31 +00:00
import (
"bytes"
"compress/flate"
"encoding/base64"
"io"
"strings"
"oss.terrastruct.com/util-go/xdefer"
2022-11-26 03:22:31 +00:00
)
// 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")
2022-11-26 03:22:31 +00:00
b := &bytes.Buffer{}
2022-11-26 03:22:31 +00:00
2023-11-07 19:36:23 +00:00
zw, err := flate.NewWriterDict(b, flate.BestCompression, nil)
2022-11-26 03:22:31 +00:00
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")
2022-11-26 03:22:31 +00:00
b64Decoded, err := base64.URLEncoding.DecodeString(encoded)
if err != nil {
return "", err
}
2023-11-07 19:36:23 +00:00
zr := flate.NewReaderDict(bytes.NewReader(b64Decoded), nil)
2022-11-26 03:22:31 +00:00
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
}