feat: daemon command stub

This commit is contained in:
Marc 2024-10-01 22:56:25 -04:00
parent da0b3dd240
commit 824ba8ba0b
Signed by: marc
GPG key ID: 048E042F22B5DC79
5 changed files with 103 additions and 0 deletions

View file

@ -20,6 +20,8 @@ func GetCli() *cobra.Command {
getStopCommand(), getStopCommand(),
// cli/build.go // cli/build.go
getBuildCommand(), getBuildCommand(),
// cli/daemon.go
getDaemonCommand(),
} }
for _, command := range allCommands { for _, command := range allCommands {

21
cli/daemon.go Normal file
View file

@ -0,0 +1,21 @@
package cli
import (
"github.com/spf13/cobra"
daemon "spud/daemon"
)
func getDaemonCommand() *cobra.Command {
startDaemon := &cobra.Command{
Use: "daemon",
Short: "Starts a daemon instance.",
RunE: func(cmd *cobra.Command, args []string) error {
d := daemon.NewDaemon("", 8000)
d.Start()
return nil
},
}
return startDaemon
}

28
daemon/api.go Normal file
View file

@ -0,0 +1,28 @@
package daemon
import (
"net/http"
)
func GetApiRoutes() map[string]http.HandlerFunc {
return map[string]http.HandlerFunc{
"/service": ServiceList,
}
}
func ServiceList(w http.ResponseWriter, r *http.Request) {
var returnPayload []byte
var returnCode int
switch r.Method {
case "POST":
returnPayload = []byte("Create service: Not implemented")
returnCode = 501
default:
returnPayload = []byte("Not implemented")
returnCode = 501
}
w.WriteHeader(returnCode)
w.Write(returnPayload)
}

25
daemon/api_test.go Normal file
View file

@ -0,0 +1,25 @@
package daemon
import (
"net/http"
"net/http/httptest"
"testing"
)
func TestServiceListUnsupportedMethods(t *testing.T) {
for _, method := range []string{http.MethodGet, http.MethodPut, http.MethodHead} {
t.Run(method, func(t *testing.T) {
req := httptest.NewRequest(method, "/service", nil)
resp := httptest.NewRecorder()
ServiceList(resp, req)
response := resp.Result()
if response.StatusCode != 501 {
t.Errorf("Expected status 501, got %d.", response.StatusCode)
}
})
}
}

27
daemon/daemon.go Normal file
View file

@ -0,0 +1,27 @@
package daemon
import (
"fmt"
"net/http"
)
type Daemon struct {
Host string
Port int
}
func NewDaemon(host string, port int) *Daemon {
return &Daemon{Host: host, Port: port}
}
func (d Daemon) GetListenAddress() string {
return fmt.Sprintf("%s:%d", d.Host, d.Port)
}
func (d Daemon) Start() {
for route, handler := range GetApiRoutes() {
http.HandleFunc(route, handler)
}
http.ListenAndServe(d.GetListenAddress(), nil)
}