56 lines
1.1 KiB
Go
56 lines
1.1 KiB
Go
package daemon
|
|
|
|
import (
|
|
"cmp"
|
|
"context"
|
|
"fmt"
|
|
"isle/bootstrap"
|
|
"slices"
|
|
|
|
"golang.org/x/exp/maps"
|
|
)
|
|
|
|
// GetHostsResult wraps the results from the GetHosts RPC method.
|
|
type GetHostsResult struct {
|
|
Hosts []bootstrap.Host
|
|
}
|
|
|
|
// RPC exposes all RPC methods which are available to be called over the RPC
|
|
// interface.
|
|
type RPC struct {
|
|
daemon Daemon
|
|
}
|
|
|
|
// NewRPC initializes and returns an RPC instance.
|
|
func NewRPC(daemon Daemon) *RPC {
|
|
return &RPC{daemon}
|
|
}
|
|
|
|
// JoinNetwork passes through to the Daemon method of the same name.
|
|
func (r *RPC) JoinNetwork(
|
|
ctx context.Context, req bootstrap.Bootstrap,
|
|
) (
|
|
struct{}, error,
|
|
) {
|
|
return struct{}{}, r.daemon.JoinNetwork(ctx, req)
|
|
}
|
|
|
|
// GetHosts returns all hosts known to the network, sorted by their name.
|
|
func (r *RPC) GetHosts(
|
|
ctx context.Context, req struct{},
|
|
) (
|
|
GetHostsResult, error,
|
|
) {
|
|
hostsMap, err := r.daemon.GetGarageBootstrapHosts(ctx)
|
|
if err != nil {
|
|
return GetHostsResult{}, fmt.Errorf("retrieving hosts: %w", err)
|
|
}
|
|
|
|
hosts := maps.Values(hostsMap)
|
|
slices.SortFunc(hosts, func(a, b bootstrap.Host) int {
|
|
return cmp.Compare(a.Name, b.Name)
|
|
})
|
|
|
|
return GetHostsResult{hosts}, nil
|
|
}
|