Packages
oaspec
0.38.0
0.68.0
0.67.0
0.66.0
0.65.0
0.64.0
0.63.0
0.62.0
0.61.0
0.60.0
0.59.0
0.58.1
0.58.0
0.57.0
0.56.0
0.55.0
0.54.0
0.53.0
0.52.0
0.51.0
0.50.0
0.49.0
0.48.0
0.47.0
0.46.0
0.45.0
0.44.0
0.43.0
0.42.0
0.41.0
0.40.0
0.39.0
0.38.0
0.37.0
0.36.0
0.35.0
0.34.0
0.33.0
0.32.0
0.31.0
0.30.0
0.29.0
0.28.0
0.27.0
0.26.0
0.25.0
0.24.0
0.23.0
0.22.0
0.21.0
0.20.0
0.19.0
0.18.0
0.17.0
0.16.0
0.15.0
0.14.0
0.13.0
0.12.0
0.11.0
0.10.0
0.9.0
0.8.0
0.7.0
0.6.3
0.6.1
0.6.0
0.5.0
0.4.0
0.3.0
0.1.3
Generate Gleam code from OpenAPI 3.x specifications
Current section
Files
Jump to
Current section
Files
src/oaspec/internal/codegen/import_analysis.gleam
import gleam/dict
import gleam/list
import gleam/option.{Some}
import oaspec/internal/openapi/schema.{
AllOfSchema, Inline, ObjectSchema, Reference,
}
import oaspec/internal/openapi/spec.{
type HttpMethod, type Operation, type Resolved, ParameterSchema, Value,
}
/// Check if any operation has parameters with Reference schemas,
/// or request body content with Reference/ObjectSchema/AllOfSchema.
/// This determines whether the generated module needs to import the types module.
pub fn operations_need_typed_schemas(
operations: List(#(String, Operation(Resolved), String, HttpMethod)),
) -> Bool {
list.any(operations, fn(op) {
let #(_, operation, _, _) = op
let has_ref_body = case operation.request_body {
Some(Value(rb)) ->
list.any(dict.to_list(rb.content), fn(ce) {
let #(_, mt) = ce
case mt.schema {
Some(Reference(..)) -> True
Some(Inline(ObjectSchema(..))) -> True
Some(Inline(AllOfSchema(..))) -> True
_ -> False
}
})
_ -> False
}
let has_ref_params =
list.any(operation.parameters, fn(ref_p) {
case ref_p {
Value(p) ->
case p.payload {
ParameterSchema(Reference(..)) -> True
_ -> False
}
_ -> False
}
})
has_ref_body || has_ref_params
})
}
/// Check if any operation has optional (non-required) parameters.
pub fn operations_have_optional_params(
operations: List(#(String, Operation(Resolved), String, HttpMethod)),
) -> Bool {
list.any(operations, fn(op) {
let #(_, operation, _, _) = op
list.any(operation.parameters, fn(ref_p) {
case ref_p {
Value(p) -> !p.required
_ -> False
}
})
})
}
/// Check if any operation has an optional (non-required) request body.
pub fn operations_have_optional_body(
operations: List(#(String, Operation(Resolved), String, HttpMethod)),
) -> Bool {
list.any(operations, fn(op) {
let #(_, operation, _, _) = op
case operation.request_body {
Some(Value(rb)) -> !rb.required
_ -> False
}
})
}