-module(oaspec@codegen@schema_utils). -compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]). -define(FILEPATH, "src/oaspec/codegen/schema_utils.gleam"). -export([schema_has_additional_properties/2, schema_has_untyped_additional_properties/2, schema_ref_is_nullable/2, schema_has_optional_fields/2, schema_ref_is_read_only/2, schema_ref_is_write_only/2, filter_read_only_properties/2, filter_write_only_properties/2]). -if(?OTP_RELEASE >= 27). -define(MODULEDOC(Str), -moduledoc(Str)). -define(DOC(Str), -doc(Str)). -else. -define(MODULEDOC(Str), -compile([])). -define(DOC(Str), -compile([])). -endif. -file("src/oaspec/codegen/schema_utils.gleam", 14). ?DOC(" Check if a schema has typed or untyped additionalProperties that would need Dict.\n"). -spec schema_has_additional_properties( oaspec@openapi@schema:schema_ref(), oaspec@codegen@context:context() ) -> boolean(). schema_has_additional_properties(Schema_ref, Ctx) -> case Schema_ref of {inline, {object_schema, _, _, _, {typed, _}, _, _}} -> true; {inline, {object_schema, _, _, _, untyped, _, _}} -> true; {inline, {all_of_schema, _, Schemas}} -> gleam@list:any( Schemas, fun(S) -> schema_has_additional_properties(S, Ctx) end ); {reference, _, _} -> case oaspec@openapi@resolver:resolve_schema_ref( Schema_ref, oaspec@codegen@context:spec(Ctx) ) of {ok, Schema_obj} -> schema_has_additional_properties({inline, Schema_obj}, Ctx); {error, _} -> false end; _ -> false end. -file("src/oaspec/codegen/schema_utils.gleam", 34). ?DOC(" Check if a schema has untyped additionalProperties (needs Dynamic import).\n"). -spec schema_has_untyped_additional_properties( oaspec@openapi@schema:schema_ref(), oaspec@codegen@context:context() ) -> boolean(). schema_has_untyped_additional_properties(Schema_ref, Ctx) -> case Schema_ref of {inline, {object_schema, _, _, _, untyped, _, _}} -> true; {inline, {all_of_schema, _, Schemas}} -> gleam@list:any( Schemas, fun(S) -> schema_has_untyped_additional_properties(S, Ctx) end ); {reference, _, _} -> case oaspec@openapi@resolver:resolve_schema_ref( Schema_ref, oaspec@codegen@context:spec(Ctx) ) of {ok, Schema_obj} -> schema_has_untyped_additional_properties( {inline, Schema_obj}, Ctx ); {error, _} -> false end; _ -> false end. -file("src/oaspec/codegen/schema_utils.gleam", 77). ?DOC(" Check if a SchemaRef is nullable, resolving $ref if needed.\n"). -spec schema_ref_is_nullable( oaspec@openapi@schema:schema_ref(), oaspec@codegen@context:context() ) -> boolean(). schema_ref_is_nullable(Ref, Ctx) -> case Ref of {inline, S} -> oaspec@openapi@schema:is_nullable(S); {reference, _, _} -> case oaspec@openapi@resolver:resolve_schema_ref( Ref, oaspec@codegen@context:spec(Ctx) ) of {ok, S@1} -> oaspec@openapi@schema:is_nullable(S@1); {error, _} -> false end end. -file("src/oaspec/codegen/schema_utils.gleam", 55). ?DOC(" Check if a schema has any optional or nullable fields that would need Option.\n"). -spec schema_has_optional_fields( oaspec@openapi@schema:schema_ref(), oaspec@codegen@context:context() ) -> boolean(). schema_has_optional_fields(Schema_ref, Ctx) -> case Schema_ref of {inline, {object_schema, _, Properties, Required, _, _, _}} -> _pipe = maps:to_list(Properties), gleam@list:any( _pipe, fun(Entry) -> {Prop_name, Prop_ref} = Entry, not gleam@list:contains(Required, Prop_name) orelse schema_ref_is_nullable( Prop_ref, Ctx ) end ); {inline, {all_of_schema, _, Schemas}} -> gleam@list:any( Schemas, fun(S) -> schema_has_optional_fields(S, Ctx) end ); {reference, _, _} -> case oaspec@openapi@resolver:resolve_schema_ref( Schema_ref, oaspec@codegen@context:spec(Ctx) ) of {ok, Schema_obj} -> schema_has_optional_fields({inline, Schema_obj}, Ctx); {error, _} -> false end; _ -> false end. -file("src/oaspec/codegen/schema_utils.gleam", 89). ?DOC(" Check if a SchemaRef has readOnly metadata, resolving $ref if needed.\n"). -spec schema_ref_is_read_only( oaspec@openapi@schema:schema_ref(), oaspec@codegen@context:context() ) -> boolean(). schema_ref_is_read_only(Ref, Ctx) -> case Ref of {inline, S} -> erlang:element(6, oaspec@openapi@schema:get_metadata(S)); {reference, _, _} -> case oaspec@openapi@resolver:resolve_schema_ref( Ref, oaspec@codegen@context:spec(Ctx) ) of {ok, S@1} -> erlang:element(6, oaspec@openapi@schema:get_metadata(S@1)); {error, _} -> false end end. -file("src/oaspec/codegen/schema_utils.gleam", 101). ?DOC(" Check if a SchemaRef has writeOnly metadata, resolving $ref if needed.\n"). -spec schema_ref_is_write_only( oaspec@openapi@schema:schema_ref(), oaspec@codegen@context:context() ) -> boolean(). schema_ref_is_write_only(Ref, Ctx) -> case Ref of {inline, S} -> erlang:element(7, oaspec@openapi@schema:get_metadata(S)); {reference, _, _} -> case oaspec@openapi@resolver:resolve_schema_ref( Ref, oaspec@codegen@context:spec(Ctx) ) of {ok, S@1} -> erlang:element(7, oaspec@openapi@schema:get_metadata(S@1)); {error, _} -> false end end. -file("src/oaspec/codegen/schema_utils.gleam", 114). ?DOC( " Filter readOnly properties from an ObjectSchema for request body context.\n" " Returns a new schema with readOnly properties removed.\n" ). -spec filter_read_only_properties( oaspec@openapi@schema:schema_object(), oaspec@codegen@context:context() ) -> oaspec@openapi@schema:schema_object(). filter_read_only_properties(Schema_obj, Ctx) -> case Schema_obj of {object_schema, Metadata, Properties, Required, Additional_properties, Min_properties, Max_properties} -> Filtered_props = gleam@dict:filter( Properties, fun(_, Prop_ref) -> not schema_ref_is_read_only(Prop_ref, Ctx) end ), Filtered_required = gleam@list:filter( Required, fun(Name) -> case gleam_stdlib:map_get(Filtered_props, Name) of {ok, _} -> true; {error, _} -> false end end ), {object_schema, Metadata, Filtered_props, Filtered_required, Additional_properties, Min_properties, Max_properties}; _ -> Schema_obj end. -file("src/oaspec/codegen/schema_utils.gleam", 153). ?DOC( " Filter writeOnly properties from an ObjectSchema for response body context.\n" " Returns a new schema with writeOnly properties removed.\n" ). -spec filter_write_only_properties( oaspec@openapi@schema:schema_object(), oaspec@codegen@context:context() ) -> oaspec@openapi@schema:schema_object(). filter_write_only_properties(Schema_obj, Ctx) -> case Schema_obj of {object_schema, Metadata, Properties, Required, Additional_properties, Min_properties, Max_properties} -> Filtered_props = gleam@dict:filter( Properties, fun(_, Prop_ref) -> not schema_ref_is_write_only(Prop_ref, Ctx) end ), Filtered_required = gleam@list:filter( Required, fun(Name) -> case gleam_stdlib:map_get(Filtered_props, Name) of {ok, _} -> true; {error, _} -> false end end ), {object_schema, Metadata, Filtered_props, Filtered_required, Additional_properties, Min_properties, Max_properties}; _ -> Schema_obj end.