goap/variousTypes.go
2024-08-22 19:56:32 +02:00

232 lines
5.3 KiB
Go

package goap
import (
"maps"
)
type PublicKey struct {
Id string
Owner string
Pem string
}
type Attachment struct {
Type string
Value string
Name string
}
type Media struct {
Type string
Url string
MediaType *string
Sensitive *bool
}
type IdValue struct {
Id string
}
type ValueValue[T any] struct {
Type *string
Value T
OtherThings map[string]any
}
func (p PublicKey) Marshal() map[string]any {
return map[string]any{
KEY_ID: p.Id,
KEY_W3_SECURITY_OWNER: IdValue{Id: p.Owner}.Marshal(),
}
}
func (a Attachment) Marshal() map[string]any {
return map[string]any{
KEY_TYPE: []string{KEY_SCHEMA_PROPERTYVALUE},
KEY_SCHEMA_VALUE: []map[string]any{ValueValue[string]{Value: a.Value}.Marshal()},
KEY_ACTIVITYSTREAMS_NAME: []map[string]any{ValueValue[string]{Value: a.Name}.Marshal()},
}
}
func (i IdValue) Marshal() map[string]any {
return map[string]any{
KEY_ID: i.Id,
}
}
func (v ValueValue[T]) Marshal() map[string]any {
m := maps.Clone(v.OtherThings)
m[KEY_VALUE] = v.Value
if v.Type != nil {
m[KEY_TYPE] = *v.Type
}
return m
}
func (m Media) Marshal() map[string]any {
t := map[string]any{
KEY_TYPE: []string{m.Type},
KEY_ACTIVITYSTREAMS_URL: []map[string]any{IdValue{Id: m.Url}.Marshal()},
}
if m.MediaType != nil {
t[KEY_ACTIVITYSTREAMS_MEDIATYPE] = []map[string]any{{KEY_VALUE: *m.MediaType}}
}
if m.Sensitive != nil {
t[KEY_ACTIVITYSTREAMS_SENSITIVE] = []map[string]any{{KEY_VALUE: *m.Sensitive}}
}
return t
}
func ParsePublicKey(_ map[string]any) (PublicKey, error) {
return PublicKey{}, NotImplementedError{}
}
func ParseAttachment(raw map[string]any) (*Attachment, error) {
attachment := Attachment{}
rawType, ok := raw[KEY_VALUE]
if !ok {
return nil, NoRequiredFieldError{KEY_VALUE}
}
types, ok := rawType.([]string)
if !ok {
return nil, BadFieldValueError[[]string]{KEY_VALUE, rawType, []string{}}
}
if len(types) != 1 {
return nil, BadFieldArrayLengthError{KEY_VALUE, 1, len(types)}
}
attachment.Type = types[0]
rawValueWrapper, ok := raw[KEY_SCHEMA_VALUE]
if !ok {
return nil, NoRequiredFieldError{KEY_SCHEMA_VALUE}
}
valueWrapper, ok := rawValueWrapper.([]map[string]any)
if !ok {
return nil, BadFieldValueError[[]map[string]any]{
KEY_SCHEMA_VALUE,
rawValueWrapper,
[]map[string]any{},
}
}
if len(valueWrapper) != 1 {
return nil, BadFieldArrayLengthError{KEY_SCHEMA_VALUE, 1, len(types)}
}
rawValue, ok := valueWrapper[0][KEY_VALUE]
if !ok {
return nil, NoRequiredSubFieldError{KEY_SCHEMA_VALUE, KEY_VALUE}
}
value, ok := rawValue.(string)
if !ok {
return nil, BadFieldValueError[string]{KEY_VALUE, rawValue, ""}
}
attachment.Value = value
rawNameWrapper, ok := raw[KEY_ACTIVITYSTREAMS_NAME]
if !ok {
return nil, NoRequiredFieldError{KEY_ACTIVITYSTREAMS_NAME}
}
nameWrapper, ok := rawNameWrapper.([]map[string]any)
if !ok {
return nil, BadFieldValueError[[]map[string]any]{
KEY_ACTIVITYSTREAMS_NAME,
rawNameWrapper,
[]map[string]any{},
}
}
if len(nameWrapper) != 1 {
return nil, BadFieldArrayLengthError{KEY_ACTIVITYSTREAMS_NAME, 1, len(nameWrapper)}
}
rawName, ok := valueWrapper[0][KEY_VALUE]
if !ok {
return nil, NoRequiredSubFieldError{KEY_ACTIVITYSTREAMS_NAME, KEY_VALUE}
}
name, ok := rawName.(string)
if !ok {
return nil, BadFieldValueError[string]{KEY_VALUE, rawValue, ""}
}
attachment.Name = name
return &attachment, nil
}
func ParseMedia(raw map[string]any) (*Media, error) {
rawType, ok := raw[KEY_TYPE]
if !ok {
return nil, NoRequiredFieldError{KEY_TYPE}
}
typeValues, ok := rawType.([]string)
if !ok {
return nil, BadFieldValueError[[]string]{KEY_TYPE, rawType, typeValues}
}
if len(typeValues) != 1 {
return nil, BadFieldArrayLengthError{KEY_TYPE, 1, len(typeValues)}
}
typeValue := typeValues[0]
urlId, err := ParseIdTypeWithName(raw, nil, KEY_ACTIVITYSTREAMS_URL)
if err != nil {
return nil, err
}
media := Media{
Type: typeValue,
Url: urlId.Id,
}
if rawSensitiveData1, ok := raw[KEY_ACTIVITYSTREAMS_SENSITIVE]; ok {
if sensitiveData1, ok := rawSensitiveData1.([]map[string]any); ok &&
len(sensitiveData1) == 1 {
if v, err := ParseValueValue[bool](sensitiveData1[0]); err == nil {
media.Sensitive = &v.Value
}
}
}
if rawMediatypeData1, ok := raw[KEY_ACTIVITYSTREAMS_MEDIATYPE]; ok {
if mediatypeData1, ok := rawMediatypeData1.([]map[string]any); ok &&
len(mediatypeData1) == 1 {
if v, err := ParseValueValue[string](mediatypeData1[0]); err == nil {
media.MediaType = &v.Value
}
}
}
return &media, nil
}
func ParseIdValue(_ map[string]any) (IdValue, error) {
return IdValue{}, NotImplementedError{}
}
func ParseValueValue[T any](raw map[string]any) (*ValueValue[T], error) {
otherData := map[string]any{}
var typeString *string = nil
var rawValue any = nil
valSet := false
for k, v := range raw {
switch k {
case KEY_VALUE:
valSet = true
rawValue = v
case KEY_TYPE:
parsed, ok := v.(string)
if !ok {
return nil, BadFieldValueError[string]{KEY_TYPE, v, ""}
}
typeString = &parsed
default:
otherData[k] = v
}
}
if !valSet {
return nil, NoRequiredFieldError{KEY_VALUE}
}
val, ok := rawValue.(T)
if !ok {
return nil, BadFieldValueError[T]{KEY_VALUE, rawValue, val}
}
return &ValueValue[T]{
Value: val,
Type: typeString,
OtherThings: otherData,
}, nil
}