defmodule Dust.Instance do @moduledoc """ Macro that generates a named Dust facade module from application config. ## Usage defmodule MyApp.Dust do use Dust, otp_app: :my_app end Then in your config: config :my_app, MyApp.Dust, stores: ["james/blog"], cache: {Dust.Cache.Memory, []}, url: Dust.cloud_url(), token: "sk_..." The default `:url` is `ws://localhost:7755/ws/sync` (the local dev server). Use `Dust.cloud_url/0` to target the hosted service at dustlayer.io. And in your supervision tree: children = [ MyApp.Dust ] The facade delegates all public API functions (get, put, delete, etc.) to `Dust.SyncEngine`, so `MyApp.Dust.get("james/blog", "key")` is equivalent to `Dust.get("james/blog", "key")`. ## Testing mode Set `testing: :manual` in config to skip starting the WebSocket connection: config :my_app, MyApp.Dust, stores: ["test/store"], cache: {Dust.Cache.Memory, []}, testing: :manual """ defmacro __using__(opts) do otp_app = Keyword.fetch!(opts, :otp_app) quote do @otp_app unquote(otp_app) def child_spec(runtime_opts) do config = Application.fetch_env!(@otp_app, __MODULE__) merged = Keyword.merge(config, runtime_opts) %{ id: __MODULE__, start: {__MODULE__, :start_link, [merged]}, type: :supervisor } end def start_link(runtime_opts \\ []) do config = Application.fetch_env!(@otp_app, __MODULE__) merged = Keyword.merge(config, runtime_opts) Dust.Supervisor.start_link(merged ++ [name: __MODULE__]) end defdelegate get(store, path), to: Dust.SyncEngine defdelegate get_many(store, paths), to: Dust.SyncEngine defdelegate entry(store, path), to: Dust.SyncEngine defdelegate put(store, path, value), to: Dust.SyncEngine defdelegate put(store, path, value, opts), to: Dust.SyncEngine defdelegate delete(store, path), to: Dust.SyncEngine defdelegate delete(store, path, opts), to: Dust.SyncEngine defdelegate merge(store, path, map), to: Dust.SyncEngine defdelegate merge(store, path, map, opts), to: Dust.SyncEngine defdelegate increment(store, path, delta \\ 1), to: Dust.SyncEngine defdelegate increment(store, path, delta, opts), to: Dust.SyncEngine defdelegate add(store, path, member), to: Dust.SyncEngine defdelegate add(store, path, member, opts), to: Dust.SyncEngine defdelegate remove(store, path, member), to: Dust.SyncEngine defdelegate remove(store, path, member, opts), to: Dust.SyncEngine defdelegate put_file(store, path, source_path), to: Dust.SyncEngine defdelegate put_file(store, path, source_path, opts), to: Dust.SyncEngine defdelegate on(store, pattern, callback, opts \\ []), to: Dust.SyncEngine defdelegate watch(store, pattern, callback, opts \\ []), to: Dust.SyncEngine, as: :on defdelegate off(store, ref), to: Dust.SyncEngine defdelegate unsubscribe(store, ref), to: Dust.SyncEngine, as: :off defdelegate enum(store, pattern), to: Dust.SyncEngine defdelegate enum(store, pattern, opts), to: Dust.SyncEngine defdelegate range(store, from, to, opts \\ []), to: Dust.SyncEngine defdelegate status(store), to: Dust.SyncEngine defdelegate lease(store, key, opts \\ []), to: Dust.SyncEngine defdelegate renew(store, lease, opts \\ []), to: Dust.SyncEngine defdelegate release(store, lease), to: Dust.SyncEngine defdelegate single_flight(store, key, fun, opts \\ []), to: Dust.SingleFlight, as: :run end end end