apoorv-2204

apoorv-2204

What is the best way to define Elixir App wide constants and errors?.In languages like go lang we export and import constants and errors.

What is the idiomatic or best, the De facto industry standard of Elixir community or generally design pattern for it?

requirements: we should be able to match them in guards and clauses, it should be as similar to normal variables in elixir function.What if we want to have constants for UI and backend at the same time, Like for an atom UI will show a String, in backend a integer.

ps: I found this article from 2016.

And some examples from timex lib, but cant use them in guard or clause
https://github.com/bitwalker/timex/blob/main/lib/timex/constants.ex

Showing Posts 1 to 10

JEG2

JEG2

Author of Designing Elixir Systems with OTP

I’m also interested in hearing answers to this, especially for options that don’t spread compile time dependencies far and wide.

ImNotAVirus

ImNotAVirus

I had replied to your old post and I’m reposting my reply but with a few additions.

For many projects, I’ve often needed to use constants/enums. So I made a lib for it: SimpleEnum.

I’ll let you read the thread for more details, but to sum up:

  • Enums can be used in guards
  • There are no dependencies, as with EctoEnum for example.
  • the introspection system makes it easy to connect SimpleEnum to other libs

Here is an example from the documentation:

iex> defmodule MyEnums do
...>   import SimpleEnum, only: [defenum: 2]
...>
...>   defenum :color, [:blue, :green, :red]
...>   defenum :day, monday: "MON", tuesday: "TUE", wednesday: "WED"
...> end

iex> require MyEnums

iex> MyEnums.color(:blue)
0
iex> MyEnums.color(0)
:blue
iex> MyEnums.day(:monday)
"MON"
iex> MyEnums.day("MON")
:monday
apoorv-2204

apoorv-2204 OP

Thank you @ImNotAVirus ,
I would like to explore macros.

dimitarvp

dimitarvp

To be fair I’d just do this:

defmodule MyApp.UnixErrors do
  defmacro __using__(_opts) do
    quote do
      @bad_argument :badarg
      @invalid :einval
    end
  end
end

defmodule MyApp.UserModule1 do
  use MyApp.UnixErrors

  def hello(), do: @bad_argument
end

This too is some level of compile-time dependencies but they are flat, there are no cycles or deep graphs involved.

apoorv-2204

apoorv-2204 OP

able to match them in guards and clauses?

dimitarvp

dimitarvp

Have you tried? :wink:

apoorv-2204

apoorv-2204 OP

yes. I have to assign to temporary variables.And also cant have capital letters

defmodule Nat.Constants do
  @moduledoc false

  defmacro __using__(_) do
    quote do
      @st1 "urn:schemas-upnp-org:device:InternetGatewayDevice:1"
      @igd_device_upnp1 "urn:schemas-upnp-org:device:InternetGatewayDevice:1"
      @wan_device_upnp1 "urn:schemas-upnp-org:device:WANDevice:1"
      # @supported_protocols [Upnpv1, Upnpv2, PMP]

      @discover_timeout 5_000
      # :inet.parse_address('239.255.255.250')
      @multicast_ip {239, 255, 255, 250}
      @multicast_port 1900
      @mx_secs "3"
      @default_mapping_lifetime 7200
      @nat_initial_ms 200
      @default_attempts 3

      @st2 "urn:schemas-upnp-org:device:InternetGatewayDevice:2"
      @igd_device_upnp2 "urn:schemas-upnp-org:device:InternetGatewayDevice:2"
      @wan_device_upnp2 "urn:schemas-upnp-org:device:WANDevice:2"

      require Logger

      @nat_tries 3
      @nat_initial_ms 250
      @lifetime 3600

      @pmp_port 5351
    end
  end
end
dimitarvp

dimitarvp

Why not? For example these:

…are basically atoms.

apoorv-2204

apoorv-2204 OP

Also cant use them in the match and clauses.

dimitarvp

dimitarvp

Ah, you mean the module attributes can’t start with a capital letter. Can’t help you there, but I don’t see why would that be a hard requirement for you either.

— All posts loaded —

Where Next? Top

Trending in Questions Top

RSP87
I’m working on a project that simulates the bumbl example in the programming phoenix book. It acts almost like an email client. We have a...
New
nseaSeb
Hello, I know there is an approach for handling lists that allows for optimized traversal, but I can’t recall the specific method (somet...
New
brecabral
Documentation While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
kpanic
Hi everyone, I am toying with the idea of building a “match maker” for giving personal help to people that wants to start coding. I sta...
New
velrest
So my question is quite simple and i have found no conclusive answer on forum, google or AI. Should we use :erlang.float for Integer to ...
New
asweet-confluent
I recently noticed that Elixir’s Logger defaults its primary log level to :debug when no :logger, :level application configuration is pre...
New
apz
I’m new to elixir and just tried to install the elixirLS extension for VScode(ium) and it is throwing some errors that I would like help ...
New

Other Trending Topics Top

GenericJam
Edit: 2026 May 15 - This post is archived. Mob is alive!! Main docs: mob v0.7.11 — Documentation A bit of explanation for the slightly c...
New
JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
garrison
Hobbes is a low-level distributed database for the Elixir programming language. Hobbes provides a simple, safe, and scalable storage lay...
New
marciok
Hi there! We created Gust: A task orchestrator inspired by Airflow. For those who have never heard about Aiflow, it’s a Python-based wor...
New
mhanberg
Hi everyone! The first release candidate for the Expert language server project is now available! We’ve published a press release detai...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews