...
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
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
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