From d52447dc2391645c9897d79e0fd64580d5256f3a Mon Sep 17 00:00:00 2001 From: mae Date: Sat, 15 Nov 2025 19:17:46 -0600 Subject: [PATCH] write go manifest representation --- api/capability.go | 79 +++++++++++++++++++++++++++++++++++++++++++++++ api/manifest.go | 25 +++++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 api/capability.go create mode 100644 api/manifest.go diff --git a/api/capability.go b/api/capability.go new file mode 100644 index 0000000..911e0fb --- /dev/null +++ b/api/capability.go @@ -0,0 +1,79 @@ +package api + +import ( + "encoding/json" + "fmt" +) + +type Capability interface { + ID() string +} +type CapabilityJSON struct { + Capability +} +type BasicCapability struct { + Id string `json:"id"` +} + +func (c BasicCapability) ID() string { + return c.Id +} + +const CapabilityBasic string = "basic" + +type DBusCapability struct { + Id string `json:"id"` + Own []string `json:"own,omitempty"` +} + +func (c DBusCapability) ID() string { + return c.Id +} + +const CapabilityDBus = "dbus" + +type capabilityType struct { + Type string `json:"type"` +} + +func (c *CapabilityJSON) MarshalJSON() ([]byte, error) { + if c == nil || c.Capability == nil { + return nil, fmt.Errorf("invalid capability") + } + var v any + switch cv := c.Capability.(type) { + case *BasicCapability: + v = &struct { + capabilityType + *BasicCapability + }{capabilityType{CapabilityBasic}, cv} + + case *DBusCapability: + v = &struct { + capabilityType + *DBusCapability + }{capabilityType{CapabilityDBus}, cv} + + default: + return nil, fmt.Errorf("invalid capability") + } + return json.Marshal(v) +} +func (c *CapabilityJSON) UnmarshalJSON(data []byte) error { + t := new(capabilityType) + if err := json.Unmarshal(data, &t); err != nil { + return err + } + switch t.Type { + case CapabilityBasic: + *c = CapabilityJSON{new(BasicCapability)} + + case CapabilityDBus: + *c = CapabilityJSON{new(DBusCapability)} + + default: + return fmt.Errorf("invalid capability") + } + + return json.Unmarshal(data, c.Capability) +} diff --git a/api/manifest.go b/api/manifest.go new file mode 100644 index 0000000..3429eb1 --- /dev/null +++ b/api/manifest.go @@ -0,0 +1,25 @@ +package api + +import "hakurei.app/container/check" + +type Manifest struct { + Metadata Metadata `json:"metadata"` + Executable Executable `json:"executable"` + Capabilities []CapabilityJSON `json:"capabilities"` + Permissions []CapabilityJSON `json:"permissions"` +} +type Metadata struct { + ID string `json:"id"` + Name string `json:"name"` + Description string `json:"description"` + Author string `json:"author"` + Icon *check.Absolute `json:"icon"` + Version int `json:"version"` + VersionName string `json:"version_name"` +} +type Executable struct { + BaseImage string `json:"base_image"` + Binary *check.Absolute `json:"binary"` + Args []string `json:"args"` + Env map[string]string `json:"env"` +}