Files
herolib/libarchive/baobab/specification/to_openapi.v
2025-10-12 12:30:19 +03:00

98 lines
2.1 KiB
V

module specification
import incubaid.herolib.schemas.jsonschema { Schema, SchemaRef }
import incubaid.herolib.schemas.openapi { Components, Info, MediaType, OpenAPI, Operation, Parameter, PathItem, ResponseSpec, ServerSpec }
import net.http
// Converts ActorSpecification to OpenAPI
pub fn (s ActorSpecification) to_openapi() OpenAPI {
if openapi_spec := s.openapi {
return openapi_spec
}
mut paths := map[string]PathItem{}
// Map ActorMethods to paths
for method in s.methods {
op := method.to_openapi_operation()
paths['${method.http_path()}'] = match method.http_method() {
.get {
PathItem{
get: op
}
}
else {
panic('unsupported http method')
}
}
// Assign operation to corresponding HTTP method
// TODO: what about other verbs
}
mut schemas := map[string]SchemaRef{}
for object in s.objects {
schemas[object.schema.id] = object.to_schema()
}
return OpenAPI{
openapi: '3.0.0'
info: Info{
title: s.name
summary: s.description
description: s.description
version: '1.0.0'
}
servers: [
ServerSpec{
url: 'http://localhost:8080'
description: 'Default server'
},
]
paths: paths
components: Components{
schemas: schemas
}
}
}
fn (bo BaseObject) to_schema() Schema {
return Schema{}
}
fn (m ActorMethod) http_path() string {
return m.name
}
fn (m ActorMethod) http_method() http.Method {
return .get
}
fn (method ActorMethod) to_openapi_operation() Operation {
mut op := Operation{
summary: method.summary
description: method.description
operation_id: method.name
}
// Convert parameters to OpenAPI format
for param in method.parameters {
op.parameters << Parameter{
name: param.name
in_: 'query' // Default to query parameters; adjust based on function context
description: param.description
required: param.required
schema: param.schema
}
}
// if method.is_void()
op.responses['200'] = ResponseSpec{
description: method.description
content: {
'application/json': MediaType{
schema: method.result.schema
}
}
}
return op
}