defmodule OpenApiSpex.Plug.Cache do @moduledoc """ Cache for OpenApiSpex API specs. Settings: ```elixir config :open_api_spex, :cache_adapter, Module ``` There are three cache implementations: * `OpenApiSpex.Plug.PersistentTermCache` - default * `OpenApiSpex.Plug.AppEnvCache` - for VMs that don't support `persistent_term` * `OpenApiSpex.Plug.NoneCache` - none cache If you are constantly modifying specs during development, you can configure the cache adapter in `dev.exs` as follows to disable caching: ```elixir config :open_api_spex, :cache_adapter, OpenApiSpex.Plug.NoneCache ``` """ alias OpenApiSpex.OpenApi default_adapter = if function_exported?(:persistent_term, :info, 0) do OpenApiSpex.Plug.PersistentTermCache else OpenApiSpex.Plug.AppEnvCache end @default_adapter default_adapter @callback get(module) :: {OpenApi.t(), map} | nil @callback put(module, {OpenApi.t(), map}) :: :ok @callback erase(module) :: :ok @doc """ Get cache adapter """ @spec adapter() :: module() def adapter do Application.get_env(:open_api_spex, :cache_adapter, @default_adapter) end @doc """ Only erase cache, put again when plug starting """ @spec refresh() :: :ok def refresh do adapter = adapter() adapter.erase() end end