79 lines
1.7 KiB
Go
79 lines
1.7 KiB
Go
package aicra
|
|
|
|
import (
|
|
"io"
|
|
"log"
|
|
"os"
|
|
|
|
"git.xdrm.io/go/aicra/api"
|
|
|
|
"git.xdrm.io/go/aicra/internal/config"
|
|
checker "git.xdrm.io/go/aicra/typecheck"
|
|
)
|
|
|
|
// Server represents an AICRA instance featuring: type checkers, services
|
|
type Server struct {
|
|
services *config.Service
|
|
Checkers *checker.Set
|
|
handlers []*api.Handler
|
|
}
|
|
|
|
// New creates a framework instance from a configuration file
|
|
func New(configPath string) (*Server, error) {
|
|
var (
|
|
err error
|
|
configFile io.ReadCloser
|
|
)
|
|
|
|
// 1. init instance
|
|
var i = &Server{
|
|
services: nil,
|
|
Checkers: checker.New(),
|
|
handlers: make([]*api.Handler, 0),
|
|
}
|
|
|
|
// 2. open config file
|
|
configFile, err = os.Open(configPath)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer configFile.Close()
|
|
|
|
// 3. load configuration
|
|
i.services, err = config.Parse(configFile)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// 4. log configuration services
|
|
log.Printf("🔧 Reading configuration '%s'\n", configPath)
|
|
logService(*i.services, "")
|
|
|
|
return i, nil
|
|
|
|
}
|
|
|
|
// HandleFunc sets a new handler for an HTTP method to a path
|
|
func (s *Server) HandleFunc(httpMethod, path string, handlerFunc api.HandlerFunc) {
|
|
handler := api.NewHandler(httpMethod, path, handlerFunc)
|
|
s.handlers = append(s.handlers, handler)
|
|
}
|
|
|
|
// Handle sets a new handler
|
|
func (s *Server) Handle(handler *api.Handler) {
|
|
s.handlers = append(s.handlers, handler)
|
|
}
|
|
|
|
// HTTP converts the server to a http server
|
|
func (s Server) HTTP() httpServer {
|
|
|
|
// 1. log available handlers
|
|
log.Printf("🔗 Mapping handlers\n")
|
|
for i := 0; i < len(s.handlers); i++ {
|
|
log.Printf(" ->\t%s\t'%s'\n", s.handlers[i].GetMethod(), s.handlers[i].GetPath())
|
|
}
|
|
|
|
// 2. cast to http server
|
|
return httpServer(s)
|
|
}
|