diff --git a/id/id.go b/id/id.go index 920b4edba74cd60c9bf62733de553722d22c66f4..d3212dea25ce20057a038d3ff4d6d9281a6e869e 100644 --- a/id/id.go +++ b/id/id.go @@ -93,42 +93,45 @@ func Join(parts ...string) string { return s } -func (id *ID) FromMap(m map[string]any) error { +func FromMap(m map[string]any) (*ID, error) { if m == nil { - return errors.New("nil map") + return nil, errors.New("nil map") } + v := new(ID) + switch m["type"] { case Organization: - id.Descriptor = new(OrganizationID) + v.Descriptor = new(OrganizationID) case Service: - id.Descriptor = new(ServiceID) + v.Descriptor = new(ServiceID) case User: - id.Descriptor = new(UserID) + v.Descriptor = new(UserID) case Space: - id.Descriptor = new(SpaceID) + v.Descriptor = new(SpaceID) case Environment: - id.Descriptor = new(EnvironmentID) + v.Descriptor = new(EnvironmentID) case Client: - id.Descriptor = new(ClientID) + v.Descriptor = new(ClientID) case Role: - id.Descriptor = new(RoleID) + v.Descriptor = new(RoleID) case Collection: - id.Descriptor = new(CollectionID) + v.Descriptor = new(CollectionID) case Schema: - id.Descriptor = new(SchemaID) + v.Descriptor = new(SchemaID) case Item: - id.Descriptor = new(ItemID) + v.Descriptor = new(ItemID) case Revision: - id.Descriptor = new(RevisionID) + v.Descriptor = new(RevisionID) case Field: - id.Descriptor = new(FieldID) + v.Descriptor = new(FieldID) default: - return errors.New("unknown type") + return nil, errors.New("unknown type") } - if err := id.Descriptor.FromMap(m); err != nil { - return err + + if err := v.Descriptor.FromMap(m); err != nil { + return nil, err } - return nil + return v, nil } diff --git a/id/id_test.go b/id/id_test.go index 757586d87ad94c461fa74291d2bc928fb806d337..a5a75cc5f563efaabbe79ddb40b2f770d4afc314 100644 --- a/id/id_test.go +++ b/id/id_test.go @@ -3,6 +3,7 @@ package id import ( "testing" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) @@ -282,10 +283,10 @@ func Test_Map(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - v := new(ID) - _ = v.FromMap(tt.id.ToMap()) - require.Equal(t, tt.id, v, "проверка FromMap для типа ID, должен быть равен исходному значению") - require.Equal(t, v.ToMap(), tt.id.ToMap()) + v, err := FromMap(tt.id.ToMap()) + require.NoError(t, err) + assert.Equal(t, tt.id, v, "проверка FromMap для типа ID, должен быть равен исходному значению") + assert.Equal(t, v.ToMap(), tt.id.ToMap()) }) } }