defmodule AppGen do @moduledoc """ #{File.read!("./README.md")} """ alias AppGen.{ AbsintheSchemaBuilder, AbsintheTypeMerge, EctoSchemaReflector, InputArguments } @type arg_opts :: [ required: list(atom), blacklist: list(atom), blacklist_non_required?: boolean, relation_inputs: list(atom) ] @type crud_from_schema_opts :: [ only: list(AbsintheGenerator.CrudResource.crud_type), except: list(AbsintheGenerator.CrudResource.crud_type), input_args: [ create: arg_opts, find: arg_opts, all: arg_opts, update: arg_opts, delete: arg_opts, find_and_update_or_create: arg_opts ] ] @type middleware_opts :: [ subscription: list(module), query: list(module), mutation: list(module), all: list(module) ] def moduledoc, do: @moduledoc def crud_from_schema(ecto_schema, opts \\ []) do relation_types = EctoSchemaReflector.schema_relationship_types([ecto_schema]) crud_resouce = EctoSchemaReflector.to_crud_resource( ecto_schema, opts[:only], opts[:except] ) schema_types = [crud_resouce | relation_types] if opts[:input_args] do schema_types ++ [&InputArguments.change_crud_input_args( &1, ecto_schema, opts[:input_args] )] else schema_types end end def remove_relations(ecto_schema, relation_key) do &AbsintheTypeMerge.remove_relations(&1, ecto_schema, relation_key) end def post_middleware(middleware_opts) do &AbsintheSchemaBuilder.add_post_middleware_to_schema(&1, middleware_opts) end def pre_middleware(middleware_opts) do &AbsintheSchemaBuilder.add_pre_middleware_to_schema(&1, middleware_opts) end def repo_contexts(repo, contexts) when is_list(contexts) do &AbsintheSchemaBuilder.add_repo_to_data_source(&1, repo, contexts) end def repo_contexts(repo, context) do repo_contexts(repo, [context]) end end