unmarshal URLs into objects
1 file changed, 23 insertions(+), 10 deletions(-)
changed files
M main.go → main.go
@@ -11,17 +11,30 @@ "go.alanpearce.eu/gomponents" "gopkg.in/yaml.v3" ) +type URL struct { + *url.URL +} + +func (u *URL) UnmarshalYAML(value *yaml.Node) (err error) { + var s string + if err := value.Decode(&s); err != nil { + return err + } + u.URL, err = url.Parse(s) + return err +} + type Config struct { Title string - Domain string - Forge string + Domain URL + Forge URL Menu []*MenuLink Packages []string } type MenuLink struct { Name string - URL string + URL URL } func must[T any](t T, err error) T {@@ -39,16 +52,16 @@ } func importString(config *Config, pkg string) string { return fmt.Sprintf("%s git %s", - must(url.JoinPath(config.Domain, pkg)), - must(url.JoinPath(config.Forge, pkg)), + config.Domain.JoinPath(pkg), + config.Forge.JoinPath(pkg), ) } func sourceString(config *Config, pkg string) string { return fmt.Sprintf("%s _ %s %s", - must(url.JoinPath(config.Domain, pkg)), - must(url.JoinPath(config.Forge, pkg))+"/tree/main{/dir}", - must(url.JoinPath(config.Forge, pkg))+"/tree/main{/dir}/{file}#n{line}", + config.Domain.JoinPath(pkg), + config.Forge.JoinPath(pkg).String()+"/tree/main{/dir}", + config.Forge.JoinPath(pkg).String()+"/tree/main{/dir}/{file}#n{line}", ) }@@ -57,11 +70,11 @@ return must(url.JoinPath("https://pkg.go.dev", packageImportPath(config, pkg))) } func packageImportPath(config *Config, pkg string) string { - return must(url.JoinPath(config.Domain, pkg)) + return config.Domain.JoinPath(pkg).String() } func packageForgeURL(config *Config, pkg string) string { - return must(url.JoinPath(config.Forge, pkg)) + return config.Forge.JoinPath(pkg).String() } func getConfig(filename string) (cfg *Config, err error) {