-module(oaspec@generate). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/oaspec/generate.gleam"). -export([generate_all_files/1, generate/2]). -export_type([generation_summary/0, generate_error/0]). -if(?OTP_RELEASE >= 27). -define(MODULEDOC(Str), -moduledoc(Str)). -define(DOC(Str), -doc(Str)). -else. -define(MODULEDOC(Str), -compile([])). -define(DOC(Str), -compile([])). -endif. -type generation_summary() :: {generation_summary, list(oaspec@codegen@context:generated_file()), binary()}. -type generate_error() :: {validation_errors, list(oaspec@codegen@validate:validation_error())}. -file("src/oaspec/generate.gleam", 70). ?DOC(" Generate shared files (types, decoders, encoders, middleware, guards).\n"). -spec generate_shared(oaspec@codegen@context:context()) -> list(oaspec@codegen@context:generated_file()). generate_shared(Ctx) -> Type_files = oaspec@codegen@types:generate(Ctx), Decoder_files = oaspec@codegen@decoders:generate(Ctx), Middleware_files = oaspec@codegen@middleware:generate(Ctx), Guard_files = oaspec@codegen@guards:generate(Ctx), lists:append([Type_files, Decoder_files, Middleware_files, Guard_files]). -file("src/oaspec/generate.gleam", 56). ?DOC(" Pure file generation: produce all GeneratedFile values without any IO.\n"). -spec generate_all_files(oaspec@codegen@context:context()) -> list(oaspec@codegen@context:generated_file()). generate_all_files(Ctx) -> Shared = generate_shared(Ctx), Server_files = case erlang:element(6, erlang:element(3, Ctx)) of server -> oaspec@codegen@server:generate(Ctx); both -> oaspec@codegen@server:generate(Ctx); client -> [] end, Client_files = case erlang:element(6, erlang:element(3, Ctx)) of client -> oaspec@codegen@client:generate(Ctx); both -> oaspec@codegen@client:generate(Ctx); server -> [] end, lists:append([Shared, Server_files, Client_files]). -file("src/oaspec/generate.gleam", 28). ?DOC( " Pure generation pipeline: hoist → dedup → validate → generate files.\n" " Takes an already-parsed spec and config; returns generated files or errors.\n" " Does not perform IO — callers handle writing files and printing output.\n" ). -spec generate(oaspec@openapi@spec:open_api_spec(), oaspec@config:config()) -> {ok, generation_summary()} | {error, generate_error()}. generate(Spec, Cfg) -> Spec_title = <<<<(erlang:element(2, erlang:element(3, Spec)))/binary, " v"/utf8>>/binary, (erlang:element(4, erlang:element(3, Spec)))/binary>>, Spec@1 = oaspec@openapi@hoist:hoist(Spec), Spec@2 = oaspec@openapi@dedup:dedup(Spec@1), Ctx = oaspec@codegen@context:new(Spec@2, Cfg), Validation_issues = oaspec@codegen@validate:validate(Ctx), Blocking_errors = oaspec@codegen@validate:errors_only(Validation_issues), case gleam@list:is_empty(Blocking_errors) of false -> {error, {validation_errors, Blocking_errors}}; true -> Files = generate_all_files(Ctx), {ok, {generation_summary, Files, Spec_title}} end.