package value_objects import ( "github.com/google/uuid" ) // AccountID represents a unique account identifier type AccountID struct { value uuid.UUID } // NewAccountID creates a new AccountID func NewAccountID() AccountID { return AccountID{value: uuid.New()} } // AccountIDFromString creates an AccountID from a string func AccountIDFromString(s string) (AccountID, error) { id, err := uuid.Parse(s) if err != nil { return AccountID{}, err } return AccountID{value: id}, nil } // AccountIDFromUUID creates an AccountID from a UUID func AccountIDFromUUID(id uuid.UUID) AccountID { return AccountID{value: id} } // String returns the string representation func (id AccountID) String() string { return id.value.String() } // UUID returns the UUID value func (id AccountID) UUID() uuid.UUID { return id.value } // IsZero checks if the AccountID is zero func (id AccountID) IsZero() bool { return id.value == uuid.Nil } // Equals checks if two AccountIDs are equal func (id AccountID) Equals(other AccountID) bool { return id.value == other.value } // MarshalJSON implements json.Marshaler interface func (id AccountID) MarshalJSON() ([]byte, error) { return []byte(`"` + id.value.String() + `"`), nil } // UnmarshalJSON implements json.Unmarshaler interface func (id *AccountID) UnmarshalJSON(data []byte) error { // Remove quotes str := string(data) if len(str) >= 2 && str[0] == '"' && str[len(str)-1] == '"' { str = str[1 : len(str)-1] } parsed, err := uuid.Parse(str) if err != nil { return err } id.value = parsed return nil }