write go manifest representation

This commit is contained in:
mae 2025-11-15 19:17:46 -06:00
parent b703b09f76
commit d52447dc23
Signed by: maemachinebroke
GPG Key ID: B54591A4805E9CC8
2 changed files with 104 additions and 0 deletions

79
api/capability.go Normal file
View File

@ -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)
}

25
api/manifest.go Normal file
View File

@ -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"`
}