diff --git a/id/client.go b/id/client.go index 56d0e2b283f82ea65c6e1cd892f06378b0346bb8..c3c9a4037909daa2701f6545d4905039fcd385de 100644 --- a/id/client.go +++ b/id/client.go @@ -1,9 +1,5 @@ package id -import ( - jsoniter "github.com/json-iterator/go" -) - const ( Client = "client" ClientsPrefix = "clients" @@ -58,20 +54,3 @@ func parseClientID(parts []string) (*ClientID, error) { id.ClientID = parts[3] return &id, nil } -func (t *ClientID) UnmarshalJSON(b []byte) error { - var data string - if err := jsoniter.Unmarshal(b, &data); err != nil { - return err - } - knownID, err := Parse(data) - if err != nil { - return err - } - t.SpaceID = knownID.(*ClientID).SpaceID - t.ClientID = knownID.(*ClientID).ClientID - return nil -} - -func (t *ClientID) MarshalJSON() ([]byte, error) { - return []byte(t.String()), nil -} diff --git a/id/collection.go b/id/collection.go index 029735ba377fa3996f0ba072be793992f6a803d8..075abc849b5378d47c3307c873e27d2908b9eb2d 100644 --- a/id/collection.go +++ b/id/collection.go @@ -1,9 +1,5 @@ package id -import ( - jsoniter "github.com/json-iterator/go" -) - const ( Collection = "collection" CollectionsPrefix = "cols" @@ -57,21 +53,3 @@ func parseCollectionID(parts []string) (*CollectionID, error) { id.EnvironmentID = *envID return &id, nil } - -func (t *CollectionID) UnmarshalJSON(b []byte) error { - var data string - if err := jsoniter.Unmarshal(b, &data); err != nil { - return err - } - knownID, err := Parse(data) - if err != nil { - return err - } - t.EnvironmentID = knownID.(*CollectionID).EnvironmentID - t.CollectionID = knownID.(*CollectionID).CollectionID - return nil -} - -func (t *CollectionID) MarshalJSON() ([]byte, error) { - return []byte(t.String()), nil -} diff --git a/id/environment.go b/id/environment.go index b8b08e83012208e217f9b33d54f200fe2d3d6ff1..ec8643a382bc97db656b54dc30419ac39ec49ddc 100644 --- a/id/environment.go +++ b/id/environment.go @@ -1,9 +1,5 @@ package id -import ( - jsoniter "github.com/json-iterator/go" -) - const ( Environment = "environment" EnvironmentsPrefix = "envs" @@ -58,21 +54,3 @@ func parseEnvironmentID(parts []string) (*EnvironmentID, error) { id.SpaceID = *spaceID return &id, nil } - -func (t *EnvironmentID) UnmarshalJSON(b []byte) error { - var data string - if err := jsoniter.Unmarshal(b, &data); err != nil { - return err - } - knownID, err := Parse(data) - if err != nil { - return err - } - t.SpaceID = knownID.(*EnvironmentID).SpaceID - t.EnvironmentID = knownID.(*EnvironmentID).EnvironmentID - return nil -} - -func (t *EnvironmentID) MarshalJSON() ([]byte, error) { - return []byte(t.String()), nil -} diff --git a/id/field.go b/id/field.go index d1539a2c8720809b9396c1dd5fdb2087f5a0cfab..b30eb59136c696af7cf563242c7c053ca26adc61 100644 --- a/id/field.go +++ b/id/field.go @@ -1,9 +1,5 @@ package id -import ( - jsoniter "github.com/json-iterator/go" -) - const ( Field = "field" FieldsPrefix = "fields" @@ -58,21 +54,3 @@ func parseFieldID(parts []string) (*FieldID, error) { id.FieldName = parts[9] return &id, nil } - -func (t *FieldID) UnmarshalJSON(b []byte) error { - var data string - if err := jsoniter.Unmarshal(b, &data); err != nil { - return err - } - knownID, err := Parse(data) - if err != nil { - return err - } - t.ItemID = knownID.(*FieldID).ItemID - t.FieldName = knownID.(*FieldID).FieldName - return nil -} - -func (t *FieldID) MarshalJSON() ([]byte, error) { - return []byte(t.String()), nil -} diff --git a/id/id.go b/id/id.go index 88cad22a4e5a0a4b8363f07d08d5aa311b0d8173..a1931febebe45c08e117c4e2a8c375337c210dd0 100644 --- a/id/id.go +++ b/id/id.go @@ -12,7 +12,7 @@ var ( ErrInvalidID = errors.New("invalid id") ) -type ID interface { +type Descriptor interface { String() string Type() string ToMap() map[string]any @@ -20,55 +20,59 @@ type ID interface { Validate() error } -func Parse(s string) (ID, error) { +type ID struct { + Descriptor +} + +func Parse(s string) (*ID, error) { parts := Split(s) if id, _ := parseServiceID(parts); id != nil { - return id, nil + return &ID{Descriptor: id}, nil } if id, _ := parseUserID(parts); id != nil { - return id, nil + return &ID{Descriptor: id}, nil } if id, _ := parseOrganizationID(parts); id != nil { - return id, nil + return &ID{Descriptor: id}, nil } if id, _ := parseSpaceID(parts); id != nil { - return id, nil + return &ID{Descriptor: id}, nil } if id, _ := parseEnvironmentID(parts); id != nil { - return id, nil + return &ID{Descriptor: id}, nil } if id, _ := parseClientID(parts); id != nil { - return id, nil + return &ID{Descriptor: id}, nil } if id, _ := parseRoleID(parts); id != nil { - return id, nil + return &ID{Descriptor: id}, nil } if id, _ := parseCollectionID(parts); id != nil { - return id, nil + return &ID{Descriptor: id}, nil } if id, _ := parseSchemaID(parts); id != nil { - return id, nil + return &ID{Descriptor: id}, nil } if id, _ := parseItemID(parts); id != nil { - return id, nil + return &ID{Descriptor: id}, nil } if id, _ := parseRevisionID(parts); id != nil { - return id, nil + return &ID{Descriptor: id}, nil } if id, _ := parseFieldID(parts); id != nil { - return id, nil + return &ID{Descriptor: id}, nil } return nil, ErrInvalidID diff --git a/id/id_test.go b/id/id_test.go index 181c7459b7b4580c4045ffed112e62d30a86496f..eb992a23f41cd722064b1d81b205a4732a520ce9 100644 --- a/id/id_test.go +++ b/id/id_test.go @@ -1,11 +1,8 @@ package id import ( - "encoding/json" "testing" - jsoniter "github.com/json-iterator/go" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -13,78 +10,78 @@ func Test_ParseID(t *testing.T) { tests := []struct { name string id string - result ID + result *ID }{ { name: Service, id: "/services/<service_id>", - result: &ServiceID{ServiceID: "<service_id>"}, + result: &ID{Descriptor: &ServiceID{ServiceID: "<service_id>"}}, }, { name: User, id: "/users/<user_id>", - result: &UserID{UserID: "<user_id>"}, + result: &ID{Descriptor: &UserID{UserID: "<user_id>"}}, }, { name: Organization, id: "/orgs/<org_id>", - result: &OrganizationID{OrganizationID: "<org_id>"}, + result: &ID{Descriptor: &OrganizationID{OrganizationID: "<org_id>"}}, }, { name: Space, id: "/spaces/<space_id>", - result: &SpaceID{SpaceID: "<space_id>"}, + result: &ID{Descriptor: &SpaceID{SpaceID: "<space_id>"}}, }, { name: Client, id: "/spaces/<space_id>/clients/<client_id>", - result: &ClientID{ + result: &ID{Descriptor: &ClientID{ SpaceID: SpaceID{SpaceID: "<space_id>"}, ClientID: "<client_id>", - }, + }}, }, { name: Role, id: "/spaces/<space_id>/roles/<role_id>", - result: &RoleID{ + result: &ID{Descriptor: &RoleID{ SpaceID: SpaceID{SpaceID: "<space_id>"}, RoleID: "<role_id>", - }, + }}, }, { name: Environment, id: "/spaces/<space_id>/envs/<env_id>", - result: &EnvironmentID{ + result: &ID{Descriptor: &EnvironmentID{ SpaceID: SpaceID{SpaceID: "<space_id>"}, EnvironmentID: "<env_id>", - }, + }}, }, { name: Collection, id: "/spaces/<space_id>/envs/<env_id>/cols/<collection_id>", - result: &CollectionID{ + result: &ID{Descriptor: &CollectionID{ EnvironmentID: EnvironmentID{ SpaceID: SpaceID{SpaceID: "<space_id>"}, EnvironmentID: "<env_id>", }, CollectionID: "<collection_id>", - }, + }}, }, { name: Schema, id: "/spaces/<space_id>/envs/<env_id>/schema/<collection_id>", - result: &SchemaID{ + result: &ID{Descriptor: &SchemaID{ EnvironmentID: EnvironmentID{ SpaceID: SpaceID{SpaceID: "<space_id>"}, EnvironmentID: "<env_id>", }, SchemaID: "<collection_id>", - }, + }}, }, { name: Item, id: "/spaces/<space_id>/envs/<env_id>/cols/<collection_id>/items/<item_id>", - result: &ItemID{ + result: &ID{Descriptor: &ItemID{ CollectionID: CollectionID{ EnvironmentID: EnvironmentID{ SpaceID: SpaceID{SpaceID: "<space_id>"}, @@ -93,12 +90,12 @@ func Test_ParseID(t *testing.T) { CollectionID: "<collection_id>", }, ItemID: "<item_id>", - }, + }}, }, { name: Revision, id: "/spaces/<space_id>/envs/<env_id>/cols/<collection_id>/items/<item_id>/revs/<rev_id>", - result: &RevisionID{ + result: &ID{Descriptor: &RevisionID{ ItemID: ItemID{ CollectionID: CollectionID{ EnvironmentID: EnvironmentID{ @@ -110,12 +107,12 @@ func Test_ParseID(t *testing.T) { ItemID: "<item_id>", }, RevisionID: "<rev_id>", - }, + }}, }, { name: Field, id: "/spaces/<space_id>/envs/<env_id>/cols/<collection_id>/items/<item_id>/fields/<field_name>", - result: &FieldID{ + result: &ID{Descriptor: &FieldID{ ItemID: ItemID{ CollectionID: CollectionID{ EnvironmentID: EnvironmentID{ @@ -127,7 +124,7 @@ func Test_ParseID(t *testing.T) { ItemID: "<item_id>", }, FieldName: "<field_name>", - }, + }}, }, } for _, tt := range tests { @@ -148,84 +145,84 @@ func Test_Map(t *testing.T) { }{ { name: Service, - id: &ServiceID{}, + id: ID{Descriptor: &ServiceID{}}, from: map[string]any{"service_id": "<service_id>"}, - to: &ServiceID{ServiceID: "<service_id>"}, + to: ID{Descriptor: &ServiceID{ServiceID: "<service_id>"}}, }, { name: User, - id: &UserID{}, + id: ID{Descriptor: &UserID{}}, from: map[string]any{"user_id": "<user_id>"}, - to: &UserID{UserID: "<user_id>"}, + to: ID{Descriptor: &UserID{UserID: "<user_id>"}}, }, { name: Organization, - id: &OrganizationID{}, + id: ID{Descriptor: &OrganizationID{}}, from: map[string]any{"organization_id": "<org_id>"}, - to: &OrganizationID{OrganizationID: "<org_id>"}, + to: ID{Descriptor: &OrganizationID{OrganizationID: "<org_id>"}}, }, { name: Space, - id: &SpaceID{}, + id: ID{Descriptor: &SpaceID{}}, from: map[string]any{"space_id": "<space_id>"}, - to: &SpaceID{SpaceID: "<space_id>"}, + to: ID{Descriptor: &SpaceID{SpaceID: "<space_id>"}}, }, { name: Client, - id: &ClientID{}, + id: ID{Descriptor: &ClientID{}}, from: map[string]any{"space_id": "<space_id>", "client_id": "<client_id>"}, - to: &ClientID{ + to: ID{Descriptor: &ClientID{ SpaceID: SpaceID{SpaceID: "<space_id>"}, ClientID: "<client_id>", - }, + }}, }, { name: Role, - id: &RoleID{}, + id: ID{Descriptor: &RoleID{}}, from: map[string]any{"space_id": "<space_id>", "role_id": "<role_id>"}, - to: &RoleID{ + to: ID{Descriptor: &RoleID{ SpaceID: SpaceID{SpaceID: "<space_id>"}, RoleID: "<role_id>", - }, + }}, }, { name: Environment, - id: &EnvironmentID{}, + id: ID{Descriptor: &EnvironmentID{}}, from: map[string]any{"space_id": "<space_id>", "env_id": "<env_id>"}, - to: &EnvironmentID{ + to: ID{Descriptor: &EnvironmentID{ SpaceID: SpaceID{SpaceID: "<space_id>"}, EnvironmentID: "<env_id>", - }, + }}, }, { name: Collection, - id: &CollectionID{}, + id: ID{Descriptor: &CollectionID{}}, from: map[string]any{"space_id": "<space_id>", "env_id": "<env_id>", "col_id": "<collection_id>"}, - to: &CollectionID{ + to: ID{Descriptor: &CollectionID{ EnvironmentID: EnvironmentID{ SpaceID: SpaceID{SpaceID: "<space_id>"}, EnvironmentID: "<env_id>", }, CollectionID: "<collection_id>", - }, + }}, }, { name: Schema, - id: &SchemaID{}, + id: ID{Descriptor: &SchemaID{}}, from: map[string]any{"space_id": "<space_id>", "env_id": "<env_id>", "schema_id": "<collection_id>"}, - to: &SchemaID{ + to: ID{Descriptor: &SchemaID{ EnvironmentID: EnvironmentID{ SpaceID: SpaceID{SpaceID: "<space_id>"}, EnvironmentID: "<env_id>", }, SchemaID: "<collection_id>", - }, + }}, }, { name: Item, - id: &ItemID{}, + id: ID{Descriptor: &ItemID{}}, from: map[string]any{"space_id": "<space_id>", "env_id": "<env_id>", "col_id": "<collection_id>", "item_id": "<item_id>"}, - to: &ItemID{ + to: ID{Descriptor: &ItemID{ CollectionID: CollectionID{ EnvironmentID: EnvironmentID{ SpaceID: SpaceID{SpaceID: "<space_id>"}, @@ -234,13 +231,13 @@ func Test_Map(t *testing.T) { CollectionID: "<collection_id>", }, ItemID: "<item_id>", - }, + }}, }, { name: Revision, - id: &RevisionID{}, + id: ID{Descriptor: &RevisionID{}}, from: map[string]any{"space_id": "<space_id>", "env_id": "<env_id>", "col_id": "<collection_id>", "item_id": "<item_id>", "rev_id": "<rev_id>"}, - to: &RevisionID{ + to: ID{Descriptor: &RevisionID{ ItemID: ItemID{ CollectionID: CollectionID{ EnvironmentID: EnvironmentID{ @@ -252,13 +249,13 @@ func Test_Map(t *testing.T) { ItemID: "<item_id>", }, RevisionID: "<rev_id>", - }, + }}, }, { name: Field, - id: &FieldID{}, + id: ID{Descriptor: &FieldID{}}, from: map[string]any{"space_id": "<space_id>", "env_id": "<env_id>", "col_id": "<collection_id>", "item_id": "<item_id>", "field_name": "<field_name>"}, - to: &FieldID{ + to: ID{Descriptor: &FieldID{ ItemID: ItemID{ CollectionID: CollectionID{ EnvironmentID: EnvironmentID{ @@ -271,7 +268,7 @@ func Test_Map(t *testing.T) { }, FieldName: "<field_name>", }, - }, + }}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { @@ -282,200 +279,3 @@ func Test_Map(t *testing.T) { }) } } - -func Test_MarshalJSON(t *testing.T) { - tests := []struct { - name string - json string - id json.Marshaler - }{ - { - Organization, - "/orgs/<org_id>", - &OrganizationID{OrganizationID: "<org_id>"}, - }, - { - Service, - "/services/<service_id>", - &ServiceID{ServiceID: "<service_id>"}, - }, - { - Space, - "/spaces/<space_id>", - &SpaceID{SpaceID: "<space_id>"}, - }, - { - Environment, - "/spaces/<space_id>/envs/<env_id>", - &EnvironmentID{SpaceID: SpaceID{SpaceID: "<space_id>"}, EnvironmentID: "<env_id>"}, - }, - { - Client, - "/spaces/<space_id>/clients/<client_id>", - &ClientID{SpaceID: SpaceID{SpaceID: "<space_id>"}, ClientID: "<client_id>"}, - }, - { - Role, - "/spaces/<space_id>/roles/<role_id>", - &RoleID{SpaceID: SpaceID{SpaceID: "<space_id>"}, RoleID: "<role_id>"}, - }, - { - Collection, - "/spaces/<space_id>/envs/<env_id>/cols/<coll_id>", - &CollectionID{EnvironmentID: EnvironmentID{SpaceID: SpaceID{SpaceID: "<space_id>"}, EnvironmentID: "<env_id>"}, CollectionID: "<coll_id>"}, - }, - { - Schema, - "/spaces/<space_id>/envs/<env_id>/schema/<coll_id>", - &SchemaID{EnvironmentID: EnvironmentID{SpaceID: SpaceID{SpaceID: "<space_id>"}, EnvironmentID: "<env_id>"}, SchemaID: "<coll_id>"}, - }, - { - Item, - "/spaces/<space_id>/envs/<env_id>/cols/<coll_id>/items/<item_id>", - &ItemID{CollectionID: CollectionID{EnvironmentID: EnvironmentID{SpaceID: SpaceID{SpaceID: "<space_id>"}, EnvironmentID: "<env_id>"}, CollectionID: "<coll_id>"}, ItemID: "<item_id>"}, - }, - { - Revision, - "/spaces/<space_id>/envs/<env_id>/cols/<coll_id>/items/<item_id>/revs/<rev_id>", - &RevisionID{ItemID: ItemID{CollectionID: CollectionID{EnvironmentID: EnvironmentID{SpaceID: SpaceID{SpaceID: "<space_id>"}, EnvironmentID: "<env_id>"}, CollectionID: "<coll_id>"}, ItemID: "<item_id>"}, RevisionID: "<rev_id>"}, - }, - { - Field, - "/spaces/<space_id>/envs/<env_id>/cols/<coll_id>/items/<item_id>/fields/<field_name>", - &FieldID{ItemID: ItemID{CollectionID: CollectionID{EnvironmentID: EnvironmentID{SpaceID: SpaceID{SpaceID: "<space_id>"}, EnvironmentID: "<env_id>"}, CollectionID: "<coll_id>"}, ItemID: "<item_id>"}, FieldName: "<field_name>"}, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - b, err := jsoniter.Marshal(tt.id) - require.NoError(t, err) - assert.Equal(t, tt.json, string(b)) - }) - } -} - -func Test_UnmarshalJSON(t *testing.T) { - tests := []struct { - name string - json string - id json.Unmarshaler - }{ - { - Organization, - "\"/orgs/<org_id>\"", - &OrganizationID{OrganizationID: "<org_id>"}, - }, - { - Service, - "\"/services/<service_id>\"", - &ServiceID{ServiceID: "<service_id>"}, - }, - { - Space, - "\"/spaces/<space_id>\"", - &SpaceID{SpaceID: "<space_id>"}, - }, - { - Environment, - "\"/spaces/<space_id>/envs/<env_id>\"", - &EnvironmentID{SpaceID: SpaceID{SpaceID: "<space_id>"}, EnvironmentID: "<env_id>"}, - }, - { - Client, - "\"/spaces/<space_id>/clients/<client_id>\"", - &ClientID{SpaceID: SpaceID{SpaceID: "<space_id>"}, ClientID: "<client_id>"}, - }, - { - Role, - "\"/spaces/<space_id>/roles/<role_id>\"", - &RoleID{SpaceID: SpaceID{SpaceID: "<space_id>"}, RoleID: "<role_id>"}, - }, - { - Collection, - "\"/spaces/<space_id>/envs/<env_id>/cols/<coll_id>\"", - &CollectionID{EnvironmentID: EnvironmentID{SpaceID: SpaceID{SpaceID: "<space_id>"}, EnvironmentID: "<env_id>"}, CollectionID: "<coll_id>"}, - }, - { - Schema, - "\"/spaces/<space_id>/envs/<env_id>/schema/<coll_id>\"", - &SchemaID{EnvironmentID: EnvironmentID{SpaceID: SpaceID{SpaceID: "<space_id>"}, EnvironmentID: "<env_id>"}, SchemaID: "<coll_id>"}, - }, - { - Item, - "\"/spaces/<space_id>/envs/<env_id>/cols/<coll_id>/items/<item_id>\"", - &ItemID{CollectionID: CollectionID{EnvironmentID: EnvironmentID{SpaceID: SpaceID{SpaceID: "<space_id>"}, EnvironmentID: "<env_id>"}, CollectionID: "<coll_id>"}, ItemID: "<item_id>"}, - }, - { - Revision, - "\"/spaces/<space_id>/envs/<env_id>/cols/<coll_id>/items/<item_id>/revs/<rev_id>\"", - &RevisionID{ItemID: ItemID{CollectionID: CollectionID{EnvironmentID: EnvironmentID{SpaceID: SpaceID{SpaceID: "<space_id>"}, EnvironmentID: "<env_id>"}, CollectionID: "<coll_id>"}, ItemID: "<item_id>"}, RevisionID: "<rev_id>"}, - }, - { - Field, - "\"/spaces/<space_id>/envs/<env_id>/cols/<coll_id>/items/<item_id>/fields/<field_name>\"", - &FieldID{ItemID: ItemID{CollectionID: CollectionID{EnvironmentID: EnvironmentID{SpaceID: SpaceID{SpaceID: "<space_id>"}, EnvironmentID: "<env_id>"}, CollectionID: "<coll_id>"}, ItemID: "<item_id>"}, FieldName: "<field_name>"}, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - switch tt.name { - case Organization: - v := new(OrganizationID) - err := v.UnmarshalJSON([]byte(tt.json)) - require.NoError(t, err) - assert.Equal(t, tt.id, v) - case Service: - v := new(ServiceID) - err := v.UnmarshalJSON([]byte(tt.json)) - require.NoError(t, err) - assert.Equal(t, tt.id, v) - case Space: - v := new(SpaceID) - err := v.UnmarshalJSON([]byte(tt.json)) - require.NoError(t, err) - assert.Equal(t, tt.id, v) - case Environment: - v := new(EnvironmentID) - err := v.UnmarshalJSON([]byte(tt.json)) - require.NoError(t, err) - assert.Equal(t, tt.id, v) - case Client: - v := new(ClientID) - err := v.UnmarshalJSON([]byte(tt.json)) - require.NoError(t, err) - assert.Equal(t, tt.id, v) - case Role: - v := new(RoleID) - err := v.UnmarshalJSON([]byte(tt.json)) - require.NoError(t, err) - assert.Equal(t, tt.id, v) - case Collection: - v := new(CollectionID) - err := v.UnmarshalJSON([]byte(tt.json)) - require.NoError(t, err) - assert.Equal(t, tt.id, v) - case Schema: - v := new(SchemaID) - err := v.UnmarshalJSON([]byte(tt.json)) - require.NoError(t, err) - assert.Equal(t, tt.id, v) - case Item: - v := new(ItemID) - err := v.UnmarshalJSON([]byte(tt.json)) - require.NoError(t, err) - assert.Equal(t, tt.id, v) - case Revision: - v := new(RevisionID) - err := v.UnmarshalJSON([]byte(tt.json)) - require.NoError(t, err) - assert.Equal(t, tt.id, v) - case Field: - v := new(FieldID) - err := v.UnmarshalJSON([]byte(tt.json)) - require.NoError(t, err) - assert.Equal(t, tt.id, v) - } - }) - } -} diff --git a/id/item.go b/id/item.go index 224c3e19e360cceb7f89f56f9a552f47be6dc308..1668dd16212d82302177041b99b984ac7c288f4c 100644 --- a/id/item.go +++ b/id/item.go @@ -1,9 +1,5 @@ package id -import ( - jsoniter "github.com/json-iterator/go" -) - const ( Item = "item" ItemsPrefix = "items" @@ -58,20 +54,3 @@ func parseItemID(parts []string) (*ItemID, error) { id.ItemID = parts[7] return &id, nil } -func (t *ItemID) UnmarshalJSON(b []byte) error { - var data string - if err := jsoniter.Unmarshal(b, &data); err != nil { - return err - } - knownID, err := Parse(data) - if err != nil { - return err - } - t.CollectionID = knownID.(*ItemID).CollectionID - t.ItemID = knownID.(*ItemID).ItemID - return nil -} - -func (t *ItemID) MarshalJSON() ([]byte, error) { - return []byte(t.String()), nil -} diff --git a/id/json.go b/id/json.go index 9c468ceb2849da037fc696262e391669e6b13af2..0a0a5789e20ebb9a9c4b493fc72fc506592cf023 100644 --- a/id/json.go +++ b/id/json.go @@ -1,59 +1,72 @@ package id import ( - "encoding/json" - "reflect" - jsoniter "github.com/json-iterator/go" ) -var knownImplementations = []ID{ - &SpaceID{}, - &EnvironmentID{}, - &CollectionID{}, - &ClientID{}, - &RoleID{}, - &SchemaID{}, - &ItemID{}, - &RevisionID{}, - &FieldID{}, - &OrganizationID{}, - &ServiceID{}, - &UserID{}, -} - -type JSONID struct { - Value ID `json:"value"` +func (id *ID) MarshalJSON() ([]byte, error) { + return jsoniter.Marshal(id.String()) } -func (t *JSONID) UnmarshalJSON(b []byte) error { - var data struct { - Type string - Value json.RawMessage - } - if err := jsoniter.Unmarshal(b, &data); err != nil { +func (id *ID) UnmarshalJSON(b []byte) error { + var s string + var err error + if err = jsoniter.Unmarshal(b, &s); err != nil { return err } - for _, knownImplementation := range knownImplementations { - if knownImplementation.Type() == data.Type { - knownType := reflect.TypeOf(knownImplementation) - target := reflect.New(knownType) - if err := jsoniter.Unmarshal(data.Value, target.Interface()); err != nil { - return err - } - t.Value = target.Elem().Interface().(ID) - return nil - } + id.Descriptor, err = Parse(s) + switch id.Type() { + case Space: + m := id.ToMap() + id.Descriptor = new(SpaceID) + _ = id.FromMap(m) + case Environment: + m := id.ToMap() + id.Descriptor = new(EnvironmentID) + _ = id.FromMap(m) + case Collection: + m := id.ToMap() + id.Descriptor = new(CollectionID) + _ = id.FromMap(m) + case Schema: + m := id.ToMap() + id.Descriptor = new(SchemaID) + _ = id.FromMap(m) + case Item: + m := id.ToMap() + id.Descriptor = new(ItemID) + _ = id.FromMap(m) + case Revision: + m := id.ToMap() + id.Descriptor = new(RevisionID) + _ = id.FromMap(m) + case Field: + m := id.ToMap() + id.Descriptor = new(FieldID) + _ = id.FromMap(m) + case Client: + m := id.ToMap() + id.Descriptor = new(ClientID) + _ = id.FromMap(m) + case Role: + m := id.ToMap() + id.Descriptor = new(RoleID) + _ = id.FromMap(m) + case User: + m := id.ToMap() + id.Descriptor = new(UserID) + _ = id.FromMap(m) + case Organization: + m := id.ToMap() + id.Descriptor = new(OrganizationID) + _ = id.FromMap(m) + case Service: + m := id.ToMap() + id.Descriptor = new(ServiceID) + _ = id.FromMap(m) + } + if err != nil { + return err } return nil } - -func (t *JSONID) MarshalJSON() ([]byte, error) { - return json.Marshal(struct { - Type string - Value any - }{ - Type: reflect.TypeOf(t.Value).String(), - Value: t.Value, - }) -} diff --git a/id/json_test.go b/id/json_test.go index 7974a13df47fdede3713405e1c056164fdd3f16e..b81650cff3b28a33b6474c665a580d5e92fcefc2 100644 --- a/id/json_test.go +++ b/id/json_test.go @@ -8,7 +8,7 @@ import ( "github.com/stretchr/testify/require" ) -func TestJSONID_MarshalJSON(t *testing.T) { +func TestID_MarshalJSON(t *testing.T) { tests := []struct { name string Value ID @@ -16,77 +16,75 @@ func TestJSONID_MarshalJSON(t *testing.T) { }{ { name: Organization, - Value: &OrganizationID{OrganizationID: "1"}, - want: "/orgs/1", + Value: ID{Descriptor: &OrganizationID{OrganizationID: "1"}}, + want: `"/orgs/1"`, }, { name: User, - Value: &UserID{UserID: "1"}, - want: "/users/1", + Value: ID{Descriptor: &UserID{UserID: "1"}}, + want: `"/users/1"`, }, { name: Service, - Value: &ServiceID{ServiceID: "1"}, - want: "/services/1", + Value: ID{Descriptor: &ServiceID{ServiceID: "1"}}, + want: `"/services/1"`, }, { name: Space, - Value: &SpaceID{SpaceID: "1"}, - want: "/spaces/1", + Value: ID{Descriptor: &SpaceID{SpaceID: "1"}}, + want: `"/spaces/1"`, }, { name: Environment, - Value: &EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}, - want: "/spaces/1/envs/1", + Value: ID{Descriptor: &EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}, + want: `"/spaces/1/envs/1"`, }, { name: Client, - Value: &ClientID{ClientID: "1", SpaceID: SpaceID{SpaceID: "1"}}, - want: "/spaces/1/clients/1", + Value: ID{Descriptor: &ClientID{ClientID: "1", SpaceID: SpaceID{SpaceID: "1"}}}, + want: `"/spaces/1/clients/1"`, }, { name: Role, - Value: &RoleID{RoleID: "1", SpaceID: SpaceID{SpaceID: "1"}}, - want: "/spaces/1/roles/1", + Value: ID{Descriptor: &RoleID{RoleID: "1", SpaceID: SpaceID{SpaceID: "1"}}}, + want: `"/spaces/1/roles/1"`, }, { name: Collection, - Value: &CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}, - want: "/spaces/1/envs/1/cols/1", + Value: ID{Descriptor: &CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}, + want: `"/spaces/1/envs/1/cols/1"`, }, { name: Schema, - Value: &SchemaID{SchemaID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}, - want: "/spaces/1/envs/1/schema/1", + Value: ID{Descriptor: &SchemaID{SchemaID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}, + want: `"/spaces/1/envs/1/schema/1"`, }, { name: Item, - Value: &ItemID{ItemID: "1", CollectionID: CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}, - want: "/spaces/1/envs/1/cols/1/items/1", + Value: ID{Descriptor: &ItemID{ItemID: "1", CollectionID: CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}}, + want: `"/spaces/1/envs/1/cols/1/items/1"`, }, { name: Revision, - Value: &RevisionID{RevisionID: "1", ItemID: ItemID{ItemID: "1", CollectionID: CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}}, - want: "/spaces/1/envs/1/cols/1/items/1/revs/1", + Value: ID{Descriptor: &RevisionID{RevisionID: "1", ItemID: ItemID{ItemID: "1", CollectionID: CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}}}, + want: `"/spaces/1/envs/1/cols/1/items/1/revs/1"`, }, { name: Field, - Value: &FieldID{FieldName: "1", ItemID: ItemID{ItemID: "1", CollectionID: CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}}, - want: "/spaces/1/envs/1/cols/1/items/1/fields/1", + Value: ID{Descriptor: &FieldID{FieldName: "1", ItemID: ItemID{ItemID: "1", CollectionID: CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}}}, + want: `"/spaces/1/envs/1/cols/1/items/1/fields/1"`, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - var j JSONID - j.Value = tt.Value got, err := jsoniter.Marshal(&tt.Value) require.NoError(t, err) - assert.Equalf(t, tt.want, string(got), "MarshalJSON()") + assert.Equal(t, tt.want, string(got)) }) } } -func TestJSONID_UnmarshalJSON(t *testing.T) { +func TestID_UnmarshalJSON(t *testing.T) { tests := []struct { name string Value ID @@ -94,70 +92,108 @@ func TestJSONID_UnmarshalJSON(t *testing.T) { }{ { name: Organization, - Value: &OrganizationID{OrganizationID: "1"}, - b: []byte(`{"type": "organization", "value": "/orgs/1"}`), + Value: ID{Descriptor: &OrganizationID{OrganizationID: "1"}}, + b: []byte(`"/orgs/1"`), }, { name: User, - Value: &UserID{UserID: "1"}, - b: []byte(`{"type": "user", "value": "/users/1"}`), + Value: ID{Descriptor: &UserID{UserID: "1"}}, + b: []byte(`"/users/1"`), }, { name: Service, - Value: &ServiceID{ServiceID: "1"}, - b: []byte(`{"type": "service", "value": "/services/1"}`), + Value: ID{Descriptor: &ServiceID{ServiceID: "1"}}, + b: []byte(`"/services/1"`), }, { name: Space, - Value: &SpaceID{SpaceID: "1"}, - b: []byte(`{"type": "space", "value": "/spaces/1"}`), + Value: ID{Descriptor: &SpaceID{SpaceID: "1"}}, + b: []byte(`"/spaces/1"`), }, { name: Environment, - Value: &EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}, - b: []byte(`{"type": "environment", "value": "/spaces/1/envs/1"}`), + Value: ID{Descriptor: &EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}, + b: []byte(`"/spaces/1/envs/1"`), }, { name: Client, - Value: &ClientID{ClientID: "1", SpaceID: SpaceID{SpaceID: "1"}}, - b: []byte(`{"type": "client", "value": "/spaces/1/clients/1"}`), + Value: ID{Descriptor: &ClientID{ClientID: "1", SpaceID: SpaceID{SpaceID: "1"}}}, + b: []byte(`"/spaces/1/clients/1"`), }, { name: Role, - Value: &RoleID{RoleID: "1", SpaceID: SpaceID{SpaceID: "1"}}, - b: []byte(`{"type": "role", "value": "/spaces/1/roles/1"}`), + Value: ID{Descriptor: &RoleID{RoleID: "1", SpaceID: SpaceID{SpaceID: "1"}}}, + b: []byte(`"/spaces/1/roles/1"`), }, { name: Collection, - Value: &CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}, - b: []byte(`{"type": "collection", "value": "/spaces/1/envs/1/cols/1"}`), + Value: ID{Descriptor: &CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}, + b: []byte(`"/spaces/1/envs/1/cols/1"`), }, { name: Schema, - Value: &SchemaID{SchemaID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}, - b: []byte(`{"type": "schema", "value": "/spaces/1/envs/1/schema/1"}`), + Value: ID{Descriptor: &SchemaID{SchemaID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}, + b: []byte(`"/spaces/1/envs/1/schema/1"`), }, { name: Item, - Value: &ItemID{ItemID: "1", CollectionID: CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}, - b: []byte(`{"type": "item", "value": "/spaces/1/envs/1/cols/1/items/1"}`), + Value: ID{Descriptor: &ItemID{ItemID: "1", CollectionID: CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}}, + b: []byte(`"/spaces/1/envs/1/cols/1/items/1"`), }, { name: Revision, - Value: &RevisionID{RevisionID: "1", ItemID: ItemID{ItemID: "1", CollectionID: CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}}, - b: []byte(`{"type": "revision", "value": "/spaces/1/envs/1/cols/1/items/1/revs/1"}`), + Value: ID{Descriptor: &RevisionID{RevisionID: "1", ItemID: ItemID{ItemID: "1", CollectionID: CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}}}, + b: []byte(`"/spaces/1/envs/1/cols/1/items/1/revs/1"`), }, { name: Field, - Value: &FieldID{FieldName: "1", ItemID: ItemID{ItemID: "1", CollectionID: CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}}, - b: []byte(`{"type": "field", "value": "/spaces/1/envs/1/cols/1/items/1/fields/1"}`), + Value: ID{Descriptor: &FieldID{FieldName: "1", ItemID: ItemID{ItemID: "1", CollectionID: CollectionID{CollectionID: "1", EnvironmentID: EnvironmentID{EnvironmentID: "1", SpaceID: SpaceID{SpaceID: "1"}}}}}}, + b: []byte(`"/spaces/1/envs/1/cols/1/items/1/fields/1"`), }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - var j JSONID - require.NoError(t, j.UnmarshalJSON(tt.b)) - assert.Equal(t, j.Value, tt.Value) + var i ID + require.NoError(t, i.UnmarshalJSON(tt.b)) + assert.Equal(t, i, tt.Value) }) } } + +func TestID_JSON(t *testing.T) { + type data struct { + ID *ID + Text string + Number int + } + + test1 := &data{ + ID: &ID{Descriptor: &SpaceID{SpaceID: Space}}, + Text: "text", + Number: 1, + } + + b, err := jsoniter.Marshal(test1) + require.NoError(t, err) + assert.Equal(t, string(b), "{\"ID\":\"/spaces/space\",\"Text\":\"text\",\"Number\":1}", "проверяем корректность Marshal данных") + + test2 := new(data) + err = jsoniter.Unmarshal(b, &test2) + require.NoError(t, err) + assert.Equal(t, test1, test2, "после Unmarshal объект должен совпадать с исходным") + + test1 = &data{ + ID: &ID{Descriptor: &OrganizationID{OrganizationID: Organization}}, + Text: "text2", + Number: 2, + } + + b, err = jsoniter.Marshal(test1) + require.NoError(t, err) + assert.Equal(t, string(b), "{\"ID\":\"/orgs/organization\",\"Text\":\"text2\",\"Number\":2}", "проверяем корректность Marshal данных") + + test2 = new(data) + err = jsoniter.Unmarshal(b, &test2) + require.NoError(t, err) + assert.Equal(t, test1, test2, "после Unmarshal объект должен совпадать с исходным") +} diff --git a/id/organization.go b/id/organization.go index 2c88414031f9a0ca9d5d3a5a87e6cf20eabf4b29..7f2ca659183118f2ed61d7beea95008605bd21e4 100644 --- a/id/organization.go +++ b/id/organization.go @@ -1,9 +1,5 @@ package id -import ( - jsoniter "github.com/json-iterator/go" -) - const ( Organization = "organization" OrganizationsPrefix = "orgs" @@ -46,19 +42,3 @@ func parseOrganizationID(parts []string) (*OrganizationID, error) { id.OrganizationID = parts[1] return &id, nil } -func (t *OrganizationID) UnmarshalJSON(b []byte) error { - var data string - if err := jsoniter.Unmarshal(b, &data); err != nil { - return err - } - knownID, err := Parse(data) - if err != nil { - return err - } - t.OrganizationID = knownID.(*OrganizationID).OrganizationID - return nil -} - -func (t *OrganizationID) MarshalJSON() ([]byte, error) { - return []byte(t.String()), nil -} diff --git a/id/revision.go b/id/revision.go index a5a1caf1b0376da20400d24b33b4ef5346db5386..3a111dfeaf6cb5cd76b8db192eeb801677edb655 100644 --- a/id/revision.go +++ b/id/revision.go @@ -1,9 +1,5 @@ package id -import ( - jsoniter "github.com/json-iterator/go" -) - const ( Revision = "revision" RevisionsPrefix = "revs" @@ -58,21 +54,3 @@ func parseRevisionID(parts []string) (*RevisionID, error) { id.RevisionID = parts[9] return &id, nil } - -func (t *RevisionID) UnmarshalJSON(b []byte) error { - var data string - if err := jsoniter.Unmarshal(b, &data); err != nil { - return err - } - knownID, err := Parse(data) - if err != nil { - return err - } - t.ItemID = knownID.(*RevisionID).ItemID - t.RevisionID = knownID.(*RevisionID).RevisionID - return nil -} - -func (t *RevisionID) MarshalJSON() ([]byte, error) { - return []byte(t.String()), nil -} diff --git a/id/role.go b/id/role.go index 9dbfcd954b850a749247e0481aa025b72a32ff0c..7080b23e741171ac4a2e8e05c31e60b2a3d88de0 100644 --- a/id/role.go +++ b/id/role.go @@ -1,9 +1,5 @@ package id -import ( - jsoniter "github.com/json-iterator/go" -) - const ( Role = "role" RolesPrefix = "roles" @@ -59,20 +55,21 @@ func parseRoleID(parts []string) (*RoleID, error) { return &id, nil } -func (t *RoleID) UnmarshalJSON(b []byte) error { - var data string - if err := jsoniter.Unmarshal(b, &data); err != nil { - return err - } - knownID, err := Parse(data) - if err != nil { - return err - } - t.SpaceID = knownID.(*RoleID).SpaceID - t.RoleID = knownID.(*RoleID).RoleID - return nil -} - -func (t *RoleID) MarshalJSON() ([]byte, error) { - return []byte(t.String()), nil -} +// +//func (t *RoleID) UnmarshalJSON(b []byte) error { +// var data string +// if err := jsoniter.Unmarshal(b, &data); err != nil { +// return err +// } +// knownID, err := Parse(data) +// if err != nil { +// return err +// } +// t.SpaceID = knownID.(*RoleID).SpaceID +// t.RoleID = knownID.(*RoleID).RoleID +// return nil +//} +// +//func (t *RoleID) MarshalJSON() ([]byte, error) { +// return []byte(t.String()), nil +//} diff --git a/id/schema.go b/id/schema.go index 43c97a4f0b8bd859937585d2771f7e4301d69a81..213baa1dffecc8859cf22ca19aadf435ae541a78 100644 --- a/id/schema.go +++ b/id/schema.go @@ -1,9 +1,5 @@ package id -import ( - jsoniter "github.com/json-iterator/go" -) - const ( Schema = "schema" SchemaPrefix = "schema" @@ -58,21 +54,3 @@ func parseSchemaID(parts []string) (*SchemaID, error) { id.SchemaID = parts[5] return &id, nil } - -func (t *SchemaID) UnmarshalJSON(b []byte) error { - var data string - if err := jsoniter.Unmarshal(b, &data); err != nil { - return err - } - knownID, err := Parse(data) - if err != nil { - return err - } - t.EnvironmentID = knownID.(*SchemaID).EnvironmentID - t.SchemaID = knownID.(*SchemaID).SchemaID - return nil -} - -func (t *SchemaID) MarshalJSON() ([]byte, error) { - return []byte(t.String()), nil -} diff --git a/id/service.go b/id/service.go index 9a55357bea06564f89d0958a2e8be9e2dcb247bf..6c3a44004008a82e1314e79150d193eb9e5c9612 100644 --- a/id/service.go +++ b/id/service.go @@ -1,9 +1,5 @@ package id -import ( - jsoniter "github.com/json-iterator/go" -) - const ( Service = "service" ServicesPrefix = "services" @@ -46,19 +42,3 @@ func parseServiceID(parts []string) (*ServiceID, error) { id.ServiceID = parts[1] return &id, nil } -func (t *ServiceID) UnmarshalJSON(b []byte) error { - var data string - if err := jsoniter.Unmarshal(b, &data); err != nil { - return err - } - knownID, err := Parse(data) - if err != nil { - return err - } - t.ServiceID = knownID.(*ServiceID).ServiceID - return nil -} - -func (t *ServiceID) MarshalJSON() ([]byte, error) { - return []byte(t.String()), nil -} diff --git a/id/space.go b/id/space.go index 401fd58d9254e78b4691590206ba4c656ff92096..3d9d6c35cba03a45d1cee00d692865e0fc8a5037 100644 --- a/id/space.go +++ b/id/space.go @@ -1,9 +1,5 @@ package id -import ( - jsoniter "github.com/json-iterator/go" -) - const ( Space = "space" SpacesPrefix = "spaces" @@ -46,20 +42,3 @@ func parseSpaceID(parts []string) (*SpaceID, error) { id.SpaceID = parts[1] return &id, nil } - -func (t *SpaceID) UnmarshalJSON(b []byte) error { - var data string - if err := jsoniter.Unmarshal(b, &data); err != nil { - return err - } - knownID, err := Parse(data) - if err != nil { - return err - } - t.SpaceID = knownID.(*SpaceID).SpaceID - return nil -} - -func (t *SpaceID) MarshalJSON() ([]byte, error) { - return []byte(t.String()), nil -} diff --git a/id/user.go b/id/user.go index 6ea9ea529c0d4606a5bfee14262c0405d5d5d812..1abaa0df603a586521247f44a3c8e18d9b112cad 100644 --- a/id/user.go +++ b/id/user.go @@ -1,9 +1,5 @@ package id -import ( - jsoniter "github.com/json-iterator/go" -) - const ( User = "user" UsersPrefix = "users" @@ -46,20 +42,3 @@ func parseUserID(parts []string) (*UserID, error) { id.UserID = parts[1] return &id, nil } - -func (t *UserID) UnmarshalJSON(b []byte) error { - var data string - if err := jsoniter.Unmarshal(b, &data); err != nil { - return err - } - knownID, err := Parse(data) - if err != nil { - return err - } - t.UserID = knownID.(*UserID).UserID - return nil -} - -func (t *UserID) MarshalJSON() ([]byte, error) { - return []byte(t.String()), nil -}