Files
sanspie a46347e2c6
ci-platforms / darwin arm64 smoke (push) Skipped
ci / build (amd64, linux, ubuntu-24.04) (push) Failing after 12m19s
ci-platforms / darwin amd64 smoke (push) Skipped
ci-platforms / windows amd64 smoke (push) Skipped
github-native / gitea-pending (push) Skipped
github-native / darwin amd64 native (push) Skipped
github-native / linux amd64 native (push) Skipped
github-native / windows amd64 native (push) Skipped
github-native / darwin arm64 native (push) Skipped
github-native / gitea-result (push) Skipped
ci / checks (push) Failing after 23m57s
ci / release (push) Skipped
GitHub / windows amd64 native GitHub-hosted native CI: failure
GitHub / darwin arm64 native GitHub-hosted native CI: failure
GitHub / darwin amd64 native GitHub-hosted native CI: failure
GitHub / linux amd64 native GitHub-hosted native CI: success
editor: add art studio and stage 12.5 workflows
2026-11-08 18:47:57 +03:00

55 lines
1.4 KiB
Go

package remoteexample
import (
"fmt"
"net/url"
)
type Link struct {
ManifestURL string
Mode string
}
// ParseLink only produces a request. It neither grants origin trust nor starts
// a project. A protocol handler must show the source and ask for confirmation.
func ParseLink(raw string) (Link, error) {
var l Link
if len(raw) > 8192 {
return l, fmt.Errorf("deep link too long")
}
u, e := url.Parse(raw)
if e != nil || u.Scheme != "aego" || u.Host != "example" || u.User != nil || u.Path != "" || u.Fragment != "" || u.Opaque != "" {
return l, fmt.Errorf("invalid example deep link")
}
q, e := url.ParseQuery(u.RawQuery)
if e != nil {
return l, e
}
for k, v := range q {
if (k != "manifest" && k != "mode") || len(v) != 1 {
return l, fmt.Errorf("unsupported or repeated deep-link parameter")
}
}
l.ManifestURL = q.Get("manifest")
l.Mode = q.Get("mode")
if l.Mode == "" {
l.Mode = "project"
}
if l.Mode != "project" && l.Mode != "scene" {
return l, fmt.Errorf("unsupported example operation")
}
if _, e := httpsURL(l.ManifestURL); e != nil {
return l, e
}
return l, nil
}
func MakeLink(raw, mode string) (string, error) {
if _, e := httpsURL(raw); e != nil {
return "", e
}
if mode != "project" && mode != "scene" {
return "", fmt.Errorf("unsupported example operation")
}
return "aego://example?" + url.Values{"manifest": {raw}, "mode": {mode}}.Encode(), nil
}