obrimbaseapi/data/framework/metadata/handler.go

89 lines
2.3 KiB
Go

package handler
import (
"embed"
"encoding/json"
"errors"
"go/module/essential/visible/service/helper/retriever"
)
// constant
const (
// resource
obrimHandlerResourceIdentifier = "framework/metadata" // change identifier if needed
obrimHandlerResourceFileName = "resource" // change file name if needed
obrimHandlerResourceFileExt = ".json" // do not change
// success
ObrimHandlerCodeSuccessResourceAvailable = "SUCCESS_RESOURCE_AVAILABLE"
// fail
ObrimHandlerCodeFailedResourceNotFound = "FAILED_RESOURCE_NOT_FOUND"
ObrimHandlerCodeFailedInvalidResource = "FAILED_INVALID_RESOURCE"
)
// obrimHandlerEmbeddedResource stores the embedded resource file.
//
//go:embed resource.json
var obrimHandlerEmbeddedResource embed.FS
// obrimHandlerProvider implements the Retriever JSON provider contract.
type obrimHandlerProvider struct{}
// Retrieve loads and returns the complete parsed resource payload.
func (provider obrimHandlerProvider) Retrieve() (any, error) {
return obrimHandlerFetch()
}
// init registers the handler during package initialization.
func init() {
obrimHandlerRegister()
}
// obrimHandlerRegister registers the handler with Retriever.
func obrimHandlerRegister() {
retriever.ObrimRetrieverJsonRegister(
obrimHandlerResourceIdentifier,
obrimHandlerProvider{},
)
}
// obrimHandlerFetch loads, parses, and returns the complete resource payload.
func obrimHandlerFetch() (any, error) {
resource, err := obrimHandlerLoadResource()
if err != nil {
return nil, err
}
payload, err := obrimHandlerParseResource(resource)
if err != nil {
return nil, err
}
return payload, nil
}
// obrimHandlerLoadResource loads the embedded resource.
func obrimHandlerLoadResource() ([]byte, error) {
resource, err := obrimHandlerEmbeddedResource.ReadFile(
obrimHandlerResourceFileName + obrimHandlerResourceFileExt,
)
if err != nil {
return nil, errors.New(ObrimHandlerCodeFailedResourceNotFound)
}
return resource, nil
}
// obrimHandlerParseResource parses the embedded JSON resource.
func obrimHandlerParseResource(resource []byte) (map[string]any, error) {
var payload map[string]any
if err := json.Unmarshal(resource, &payload); err != nil {
return nil, errors.New(ObrimHandlerCodeFailedInvalidResource)
}
return payload, nil
}