Funciones del Registro
El registro proporciona un conjunto de funciones para trabajar con recursos FHIR de forma dinamica – cuando el tipo de recurso no se conoce en tiempo de compilacion. Estas funciones estan respaldadas por un mapa de fabrica interno que asocia cada nombre de tipo de recurso con una funcion constructora.
Todas las funciones del registro se exportan desde el paquete de version (por ejemplo, r4.NewResource, r4.UnmarshalResource).
NewResource
Crea una nueva instancia vacia del tipo de recurso especificado.
Firma
func NewResource(resourceType string) (Resource, error)Parametros
resourceType– El nombre del tipo de recurso FHIR, por ejemplo,"Patient","Observation". Sensible a mayusculas y minusculas.
Retorna
- Una interfaz
Resourceapuntando a una struct recien asignada y con valor cero del tipo solicitado. - Un error si el nombre del tipo de recurso no es reconocido.
Ejemplo
import "github.com/gofhir/models/r4/v2"
res, err := r4.NewResource("Patient")
if err != nil {
log.Fatal(err)
}
res.SetId("new-patient-1")
// Type-assert si necesitas el tipo concreto
patient := res.(*r4.Patient)
fmt.Println(patient.GetResourceType()) // "Patient"UnmarshalResource
Deserializa un slice de bytes JSON en la struct de recurso correcta. Primero inspecciona el campo resourceType en el JSON para determinar el tipo, luego deserializa el payload completo en la struct Go apropiada.
Firma
func UnmarshalResource(data []byte) (Resource, error)Parametros
data– Un slice de bytes JSON que contiene un recurso FHIR con un camporesourceType.
Retorna
- Una interfaz
Resourceapuntando a la struct completamente poblada. - Un error si el JSON es invalido, el campo
resourceTypefalta, o el tipo no es reconocido.
Ejemplo
import "github.com/gofhir/models/r4/v2"
jsonData := []byte(`{
"resourceType": "Patient",
"id": "example",
"name": [{"family": "Smith", "given": ["John"]}]
}`)
res, err := r4.UnmarshalResource(jsonData)
if err != nil {
log.Fatal(err)
}
patient := res.(*r4.Patient)
fmt.Println(*patient.Name[0].Family) // "Smith"GetResourceType
Extrae el campo resourceType de un slice de bytes JSON sin deserializar completamente el recurso. Esto es util para enrutamiento o validacion antes de comprometerse con la deserializacion completa.
Firma
func GetResourceType(data []byte) (string, error)Parametros
data– Un slice de bytes JSON que debe contener un camporesourceType.
Retorna
- El nombre del tipo de recurso como string.
- Un error si el JSON es invalido o el campo
resourceTypefalta o esta vacio.
Ejemplo
import "github.com/gofhir/models/r4/v2"
data := []byte(`{"resourceType": "Observation", "id": "123"}`)
rt, err := r4.GetResourceType(data)
if err != nil {
log.Fatal(err)
}
fmt.Println(rt) // "Observation"
// Usar para enrutamiento antes de la deserializacion completa
switch rt {
case "Patient":
handlePatient(data)
case "Observation":
handleObservation(data)
default:
handleGeneric(data)
}IsKnownResourceType
Verifica si un nombre de tipo de recurso dado es reconocido por el registro.
Firma
func IsKnownResourceType(resourceType string) boolParametros
resourceType– El nombre del tipo de recurso a verificar. Sensible a mayusculas y minusculas.
Retorna
truesi el tipo es un recurso FHIR conocido para esta version.falseen caso contrario.
Ejemplo
import "github.com/gofhir/models/r4/v2"
r4.IsKnownResourceType("Patient") // true
r4.IsKnownResourceType("Observation") // true
r4.IsKnownResourceType("HumanName") // false (tipo de dato, no un recurso)
r4.IsKnownResourceType("FakeResource") // falseAllResourceTypes
Devuelve un slice que contiene todos los nombres de tipos de recurso conocidos para esta version de FHIR.
Firma
func AllResourceTypes() []stringRetorna
- Un slice con todos los nombres de tipos de recurso. El orden no esta garantizado.
Ejemplo
import (
"fmt"
"sort"
"github.com/gofhir/models/r4/v2"
)
types := r4.AllResourceTypes()
sort.Strings(types)
fmt.Printf("R4 defines %d resource types\n", len(types))
// R4 defines 148 resource types
for _, t := range types[:5] {
fmt.Println(t)
}
// Account
// ActivityDefinition
// AdverseEvent
// AllergyIntolerance
// AppointmentPatrones Comunes
Router de Recursos para Servidor FHIR
import (
"net/http"
"github.com/gofhir/models/r4/v2"
)
func handleCreate(w http.ResponseWriter, req *http.Request) {
data, _ := io.ReadAll(req.Body)
rt, err := r4.GetResourceType(data)
if err != nil {
http.Error(w, "Invalid FHIR resource", http.StatusBadRequest)
return
}
if !r4.IsKnownResourceType(rt) {
http.Error(w, "Unknown resource type: "+rt, http.StatusBadRequest)
return
}
resource, err := r4.UnmarshalResource(data)
if err != nil {
http.Error(w, "Failed to parse resource", http.StatusBadRequest)
return
}
// Procesar el recurso...
resource.SetId(generateId())
// Almacenar, validar, etc.
}