package share import ( "time" "forge.cadoles.com/arcad/edge/pkg/app" ) type BaseResource struct { id ResourceID origin app.ID attributes []Attribute } // Attributes implements Resource func (r *BaseResource) Attributes() []Attribute { return r.attributes } // ID implements Resource func (r *BaseResource) ID() ResourceID { return r.id } // Origin implements Resource func (r *BaseResource) Origin() app.ID { return r.origin } func (r *BaseResource) SetAttribute(attr Attribute) { for idx, rAttr := range r.attributes { if rAttr.Name() != attr.Name() { continue } r.attributes[idx] = attr return } r.attributes = append(r.attributes, attr) } func NewBaseResource(origin app.ID, resourceID ResourceID, attributes ...Attribute) *BaseResource { return &BaseResource{ id: resourceID, origin: origin, attributes: attributes, } } var _ Resource = &BaseResource{} type BaseAttribute struct { name string valueType ValueType value any createdAt time.Time updatedAt time.Time } // CreatedAt implements Attribute func (a *BaseAttribute) CreatedAt() time.Time { return a.createdAt } // Name implements Attribute func (a *BaseAttribute) Name() string { return a.name } // Type implements Attribute func (a *BaseAttribute) Type() ValueType { return a.valueType } // UpdatedAt implements Attribute func (a *BaseAttribute) UpdatedAt() time.Time { return a.updatedAt } // Value implements Attribute func (a *BaseAttribute) Value() any { return a.value } func (a *BaseAttribute) SetCreatedAt(createdAt time.Time) { a.createdAt = createdAt } func (a *BaseAttribute) SetUpdatedAt(updatedAt time.Time) { a.updatedAt = updatedAt } func NewBaseAttribute(name string, valueType ValueType, value any) *BaseAttribute { return &BaseAttribute{ name: name, valueType: valueType, value: value, } } var _ Attribute = &BaseAttribute{} func HasAttribute(res Resource, name string, valueType ValueType) bool { return GetAttribute(res, name, valueType) != nil } func GetAttribute(res Resource, name string, valueType ValueType) Attribute { for _, attr := range res.Attributes() { if attr.Name() != name { continue } if attr.Type() == valueType { return attr } } return nil }