// SPDX-License-Identifier: EUPL-1.2 package plugin import ( json "dappco.re/go/core/scm/internal/ax/jsonx" "dappco.re/go/core/io" coreerr "dappco.re/go/core/log" ) // Manifest represents a plugin.json manifest file. // Each plugin repository must contain a plugin.json at its root. type Manifest struct { Name string `json:"name"` Version string `json:"version"` Description string `json:"description"` Author string `json:"author"` Entrypoint string `json:"entrypoint"` Dependencies []string `json:"dependencies,omitempty"` MinVersion string `json:"min_version,omitempty"` } // LoadManifest reads and parses a plugin.json file from the given path. // Usage: LoadManifest(...) func LoadManifest(m io.Medium, path string) (*Manifest, error) { content, err := m.Read(path) if err != nil { return nil, coreerr.E("plugin.LoadManifest", "failed to read manifest", err) } var manifest Manifest if err := json.Unmarshal([]byte(content), &manifest); err != nil { return nil, coreerr.E("plugin.LoadManifest", "failed to parse manifest JSON", err) } return &manifest, nil } // Validate checks the manifest for required fields. // Returns an error if name, version, or entrypoint are missing. // Usage: Validate(...) func (m *Manifest) Validate() error { if m.Name == "" { return coreerr.E("plugin.Manifest.Validate", "name is required", nil) } if m.Version == "" { return coreerr.E("plugin.Manifest.Validate", "version is required", nil) } if m.Entrypoint == "" { return coreerr.E("plugin.Manifest.Validate", "entrypoint is required", nil) } return nil }