59 lines
1.1 KiB
Go
59 lines
1.1 KiB
Go
package discovery
|
|
|
|
import (
|
|
"net/url"
|
|
"os"
|
|
"path"
|
|
|
|
"git.twelvetwelve.org/library/core/json"
|
|
)
|
|
|
|
type LocalDiscovery struct {
|
|
}
|
|
|
|
func lookup(kv map[string]string, serviceUrn string) *url.URL {
|
|
rawURL, ok := kv[serviceUrn]
|
|
if !ok {
|
|
return nil
|
|
}
|
|
|
|
u, err := url.Parse(rawURL)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
return u
|
|
}
|
|
|
|
func lookupFrom(path string, serviceUrn string) *url.URL {
|
|
services := make(map[string]string)
|
|
err := json.ReadFromFile(path, &services)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
return lookup(services, serviceUrn)
|
|
}
|
|
|
|
func (ld *LocalDiscovery) Discover(serviceUrn string) (*url.URL, error) {
|
|
if url := lookupFrom("discovery.json", serviceUrn); url != nil {
|
|
return url, nil
|
|
}
|
|
|
|
home, err := os.UserHomeDir()
|
|
if err != nil {
|
|
homeConf := path.Join(home, ".config", "discovery.json")
|
|
if url := lookupFrom(homeConf, serviceUrn); url != nil {
|
|
return url, nil
|
|
}
|
|
}
|
|
|
|
if url := lookupFrom("/etc/discovery/discovery.json", serviceUrn); url != nil {
|
|
return url, nil
|
|
}
|
|
|
|
return nil, os.ErrNotExist
|
|
}
|
|
|
|
func NewLocalDiscovery() *LocalDiscovery {
|
|
return &LocalDiscovery{}
|
|
}
|