diff --git a/cmd/x509.go b/cmd/x509.go index 40924c8..6f1f025 100644 --- a/cmd/x509.go +++ b/cmd/x509.go @@ -144,7 +144,7 @@ var csrInfoCMD = &cobra.Command{ return errors.Wrap(err, "readable csr") } - output, err := gutils.JSON.MarshalIndent(csrm, "", " ") + output, err := json.MarshalIndent(csrm, "", " ") if err != nil { return errors.Wrap(err, "marshal csr") } diff --git a/crypto/x509.go b/crypto/x509.go index 2f470e2..73ee2ff 100644 --- a/crypto/x509.go +++ b/crypto/x509.go @@ -11,17 +11,19 @@ import ( "crypto/x509/pkix" "encoding/asn1" "fmt" - "github.com/Laisky/errors/v2" - gutils "github.com/Laisky/go-utils/v4" - gcounter "github.com/Laisky/go-utils/v4/counter" - glog "github.com/Laisky/go-utils/v4/log" - "github.com/Laisky/zap" "math/big" "net" "net/mail" "net/url" "strings" "time" + + "github.com/Laisky/errors/v2" + "github.com/Laisky/zap" + + gutils "github.com/Laisky/go-utils/v4" + gcounter "github.com/Laisky/go-utils/v4/counter" + glog "github.com/Laisky/go-utils/v4/log" ) // X509CertSerialNumberGenerator x509 certificate serial number generator @@ -390,7 +392,7 @@ type signCSROption struct { // ocsps ocsp servers ocsps []string - extentions, extraExtensions []pkix.Extension + extensions, extraExtensions []pkix.Extension // pubkey csr will specific csr's pubkey, not use ca's pubkey pubkey crypto.PublicKey @@ -433,15 +435,15 @@ func WithX509SerialNumGenerator(gen X509CertSerialNumberGenerator) SignCSROption } } -// WithX509SignCSRExtenstions set certificate extentions +// WithX509SignCSRExtenstions set certificate extensions func WithX509SignCSRExtenstions(exts ...pkix.Extension) SignCSROption { return func(o *signCSROption) error { - o.extentions = append(o.extentions, exts...) + o.extensions = append(o.extensions, exts...) return nil } } -// WithX509SignCSRExtraExtenstions set certificate extra extentions +// WithX509SignCSRExtraExtenstions set certificate extra extensions func WithX509SignCSRExtraExtenstions(exts ...pkix.Extension) SignCSROption { return func(o *signCSROption) error { o.extraExtensions = append(o.extraExtensions, exts...) @@ -615,7 +617,7 @@ func NewX509CertByCSR( WithX509CertIPAddrs(csr.IPAddresses...), WithX509CertURIs(csr.URIs...), WithX509CertPubkey(csr.PublicKey), - WithX509CertExtentions(append(opt.extentions, csr.Extensions...)...), + WithX509CertExtentions(append(opt.extensions, csr.Extensions...)...), WithX509CertExtraExtensions(append(opt.extraExtensions, csr.ExtraExtensions...)...), } if opt.isCA { @@ -644,15 +646,15 @@ func (o *x509V3CertOption) fillDefault() *x509V3CertOption { // X509CertOption option to generate tls certificate type X509CertOption func(*x509V3CertOption) error -// WithX509CertExtentions set extentions +// WithX509CertExtentions set extensions func WithX509CertExtentions(exts ...pkix.Extension) X509CertOption { return func(o *x509V3CertOption) error { - o.signCSROption.extentions = append(o.signCSROption.extentions, exts...) + o.signCSROption.extensions = append(o.signCSROption.extensions, exts...) return nil } } -// WithX509CertExtraExtensions set extra extentions +// WithX509CertExtraExtensions set extra extensions func WithX509CertExtraExtensions(exts ...pkix.Extension) X509CertOption { return func(o *x509V3CertOption) error { o.signCSROption.extraExtensions = append(o.signCSROption.extraExtensions, exts...) @@ -1101,7 +1103,7 @@ func NewX509Cert(prikey crypto.PrivateKey, opts ...X509CertOption) (certDer []by DNSNames: opt.dnsNames, IPAddresses: opt.ipAddresses, URIs: opt.uris, - Extensions: opt.signCSROption.extentions, + Extensions: opt.signCSROption.extensions, ExtraExtensions: opt.signCSROption.extraExtensions, } diff --git a/go.mod b/go.mod index ce48e1a..d6cffe4 100644 --- a/go.mod +++ b/go.mod @@ -20,6 +20,7 @@ require ( github.com/klauspost/pgzip v1.2.5 github.com/monnand/dhkx v0.0.0-20180522003156-9e5b033f1ac4 github.com/niclabs/tcrsa v0.0.5 + github.com/pkg/errors v0.8.1 github.com/rivo/duplo v0.0.0-20220703183130-751e882e6b83 github.com/spf13/cobra v1.6.1 github.com/stretchr/testify v1.8.2 diff --git a/go.sum b/go.sum index d7b1e2d..8c778fb 100644 --- a/go.sum +++ b/go.sum @@ -62,6 +62,7 @@ github.com/niclabs/tcrsa v0.0.5 h1:QgS3DOhBBlhNloRif7M1DLhEkgijEedcx3G2IYXcUWw= github.com/niclabs/tcrsa v0.0.5/go.mod h1:ratVlzSF2LkdYLmDDvqwmpQFtHbyZIWTa1J02Ogxw+A= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= diff --git a/http.go b/http.go index 46b93a1..a793725 100644 --- a/http.go +++ b/http.go @@ -13,6 +13,7 @@ import ( "github.com/Laisky/go-chaining" "github.com/Laisky/zap" + "github.com/Laisky/go-utils/v4/json" "github.com/Laisky/go-utils/v4/log" ) @@ -161,7 +162,7 @@ func RequestJSONWithClient(httpClient *http.Client, var ( jsonBytes []byte ) - jsonBytes, err = JSON.Marshal(request.Data) + jsonBytes, err = json.Marshal(request.Data) if err != nil { return errors.Wrap(err, "marshal request data error") } @@ -196,7 +197,7 @@ func RequestJSONWithClient(httpClient *http.Client, return errors.Wrap(err, "try to read response data error") } log.Shared.Debug("got resp", zap.ByteString("resp", respBytes)) - err = JSON.Unmarshal(respBytes, resp) + err = json.Unmarshal(respBytes, resp) if err != nil { return errors.Wrapf(err, "unmarshal response `%s`", string(respBytes[:])) } diff --git a/json/comment.go b/json/comment.go new file mode 100644 index 0000000..08fa082 --- /dev/null +++ b/json/comment.go @@ -0,0 +1,45 @@ +package json + +import ( + "encoding/json" + + "github.com/pkg/errors" + "github.com/tailscale/hujson" +) + +// Unmarshal unmarshal json, support comment +func Unmarshal(data []byte, v interface{}) (err error) { + if len(data) == 0 { + return nil + } + + data, err = standardizeJSON(data) + if err != nil { + return errors.Wrap(err, "standardize json") + } + + return json.Unmarshal(data, v) +} + +// UnmarshalFromString unmarshal json from string, support comment +func UnmarshalFromString(str string, v interface{}) (err error) { + if str == "" { + return nil + } + + data, err := standardizeJSON([]byte(str)) + if err != nil { + return errors.Wrap(err, "standardize json") + } + + return json.Unmarshal(data, v) +} + +func standardizeJSON(b []byte) ([]byte, error) { + ast, err := hujson.Parse(b) + if err != nil { + return b, err + } + ast.Standardize() + return ast.Pack(), nil +} diff --git a/json/json.go b/json/json.go new file mode 100644 index 0000000..4a9c5cc --- /dev/null +++ b/json/json.go @@ -0,0 +1,17 @@ +// Package json implements encoding and decoding of JSON as defined in RFC 7159. +package json + +import "encoding/json" + +var ( + // Marshal marshal v to string + Marshal = json.Marshal + // MarshalIndent marshal v to string with indent + MarshalIndent = json.MarshalIndent +) + +// MarshalToString marshal v to string +func MarshalToString(v interface{}) (string, error) { + b, err := json.Marshal(v) + return string(b), err +} diff --git a/rbac.go b/rbac.go index 26e639d..866d5e8 100644 --- a/rbac.go +++ b/rbac.go @@ -5,6 +5,8 @@ import ( "strings" "github.com/Laisky/errors/v2" + + "github.com/Laisky/go-utils/v4/json" ) const ( @@ -305,11 +307,11 @@ func (p *RBACPermissionElem) GetElemByKey(key RBACPermFullKey) *RBACPermissionEl // Value implement GORM interface func (p RBACPermissionElem) Value() (driver.Value, error) { - b, err := JSON.Marshal(p) + b, err := json.Marshal(p) return string(b), err } // Scan implement GORM interface func (p *RBACPermissionElem) Scan(input any) error { - return JSON.Unmarshal(input.([]byte), p) + return json.Unmarshal(input.([]byte), p) } diff --git a/utils.go b/utils.go index b134130..7c48f21 100644 --- a/utils.go +++ b/utils.go @@ -30,15 +30,21 @@ import ( "github.com/google/go-cpy/cpy" "github.com/google/uuid" jsoniter "github.com/json-iterator/go" - "github.com/tailscale/hujson" "go.uber.org/automaxprocs/maxprocs" "golang.org/x/sync/singleflight" + "github.com/Laisky/go-utils/v4/json" "github.com/Laisky/go-utils/v4/log" ) +type jsonT struct { + jsoniter.API +} + var ( // JSON effective json + // + // Deprecated: use github.com/Laisky/go-utils/v4/json instead JSON = jsonT{API: jsoniter.ConfigCompatibleWithStandardLibrary} internalSFG singleflight.Group @@ -86,47 +92,6 @@ func (d *dedentOpt) applyOpts(optfs ...DedentOptFunc) *dedentOpt { return d } -type jsonT struct { - jsoniter.API -} - -// Unmarshal unmarshal json, support comment -func (j *jsonT) Unmarshal(data []byte, v interface{}) (err error) { - if len(data) == 0 { - return nil - } - - data, err = standardizeJSON(data) - if err != nil { - return errors.Wrap(err, "standardize json") - } - - return j.API.Unmarshal(data, v) -} - -// UnmarshalFromString unmarshal json from string, support comment -func (j *jsonT) UnmarshalFromString(str string, v interface{}) (err error) { - if str == "" { - return nil - } - - data, err := standardizeJSON([]byte(str)) - if err != nil { - return errors.Wrap(err, "standardize json") - } - - return j.Unmarshal(data, v) -} - -func standardizeJSON(b []byte) ([]byte, error) { - ast, err := hujson.Parse(b) - if err != nil { - return b, err - } - ast.Standardize() - return ast.Pack(), nil -} - // SilentClose close and ignore error // // Example @@ -246,7 +211,7 @@ func MD5JSON(data any) (string, error) { return "", errors.New("data is nil") } - b, err := JSON.Marshal(data) + b, err := json.Marshal(data) if err != nil { return "", err } @@ -1107,7 +1072,7 @@ func PrettyBuildInfo() string { return "" } - ver, err := JSON.MarshalIndent(info.Main, "", " ") + ver, err := json.MarshalIndent(info.Main, "", " ") if err != nil { log.Shared.Error("failed to marshal version", zap.Error(err)) return "" diff --git a/utils_test.go b/utils_test.go index ef2f926..24a50fe 100644 --- a/utils_test.go +++ b/utils_test.go @@ -23,6 +23,7 @@ import ( "github.com/stretchr/testify/require" "golang.org/x/sync/errgroup" + "github.com/Laisky/go-utils/v4/json" "github.com/Laisky/go-utils/v4/log" ) @@ -146,21 +147,21 @@ func TestValidateFileHash(t *testing.T) { func TestJSON(t *testing.T) { t.Run("marshal", func(t *testing.T) { - jb, err := JSON.Marshal("123") + jb, err := json.Marshal("123") require.NoError(t, err) var v string - JSON.Unmarshal(jb, &v) + json.Unmarshal(jb, &v) require.NoError(t, err) require.Equal(t, "123", v) }) t.Run("marshal string", func(t *testing.T) { - jb, err := JSON.MarshalToString("123") + jb, err := json.MarshalToString("123") require.NoError(t, err) var v string - JSON.UnmarshalFromString(jb, &v) + json.UnmarshalFromString(jb, &v) require.NoError(t, err) require.Equal(t, "123", v) }) @@ -173,7 +174,7 @@ func TestJSON(t *testing.T) { // comment "k": "v" // comment }` - err := JSON.Unmarshal([]byte(raw), &d) + err := json.Unmarshal([]byte(raw), &d) require.NoError(t, err) require.Equal(t, "v", d.K) }) @@ -262,7 +263,7 @@ func ExampleRegexNamedSubMatch() { func TestFlattenMap(t *testing.T) { data := map[string]any{} j := []byte(`{"a": "1", "b": {"c": 2, "d": {"e": 3}}, "f": 4, "g": {}}`) - if err := JSON.Unmarshal(j, &data); err != nil { + if err := json.Unmarshal(j, &data); err != nil { t.Fatalf("got error: %+v", err) }