chouzar

chouzar

Getting the Module name of where a function is executed

I would like to get from “where” a particular function is executed. Is this possible in elixir? For example:

defmodule Sender do

  def to(pid) do
    send(pid, build_message()) 
  end

  defp build_message() do
    %{
      module: __MODULE__, # Can this be obtained at runtime?
      from: self(),
      message: "Hola!"
    }
  end

end

In the future I would like to separate the build_message function into its own thing so it doesn’t need to know the __MODULE__s value (which I guess its defined at compile time).

Macros might be a solution here :thinking: but have been avoiding them :sweat_smile: wonder if anyone has any pointers on this?

Most Liked

al2o3cr

al2o3cr

A macro would be useful here - Ecto.Repo does exactly that to pass along the name of the module that’s calling use Ecto.Repo in all the functions:

chouzar

chouzar

Thanks @hauleth appreciate your comments :slight_smile: and you’re probably right with the XY problem :sweat_smile: but let me better explain my case (which admitelly is not much of a use case at this point).

The idea behind comes from wanting to better standardize messaging between different system “components”; concretely I’m trying to apply a standard to messages between my LiveView and LiveComponent modules.

I have this struct defined:

defmodule Action do
  defstruct [
    module: Unknown,
    message: "",
    data: %{}
  ]

  # Along with some constructor helpers
  # ...
end

When sending messages between LiveComponents to LiveViews since both share the same pid, I’m thinking it would be nice to differentiate between them via the component’s module name:

# Although I'm using the Liveview framework as an example 
# this probably not that important, it could be viewed as 
# any process or genserver trying to send and catch a message.

# From the live component
defmodule LiveComponent.SendEmail do
  use Web, :live_component

  # mount, render, process callbacks

  # send being a a helper function
  defp send() do
    send(self(), %Action{
      module: __MODULE__, 
      message: "send-to", 
      data: %{to: "email@email.com", body: "Hello!"}
    }
  end
end

# From the liveview or process that receives the event
defmodule Web.Demo.TreatmentDisplayLive do
  use Web, :live_view

  # mount, render, process callbacks

  # receive the message from the livecomponent
  @impl true
  def handle_info(msg = %{module: LiveComponent.SendEmail}, socket) do
    case msg.message do
      "send-to" -> 
        # process info...

      _other ->
        # process diferently...
    end
  end

I understand even this example will seem nonsensical, what is the point? why not just send a tuple? What I think this achieves is:

  • A little bit of “extra metadata” for pattern matching purposes, it is on the programmer’s end to enforce a match of this module.
  • Programmers reading the code might find it easier to parse and know where a message is coming from (module-wise speaking).

I’m currently just experimenting (not a clear path), but would like to expand this idea and see where it goes.

Where Next?

Popular in Questions Top

lessless
I believe there are people here who are dealing with CSV files import on the daily basis, and since Excel is a really popular tool there ...
New
gshaw
What is the idiomatic way of matching for not nil in Elixir? E.g., First way: defp halt_if_not_signed_in(conn, signed_in_account) when...
New
JorisKok
I have a server on AWS, and was running a load test using artillery. When looking at the Phoenix dashboard I see the Ports going to 100% ...
New
joaquinalcerro
Hi there, I am working with Ecto-Postgresql and I need to call all of the records from a specific table but the table has 40,000 record...
New
jerry
Good day to you all. I have been struggling to get a query involving like and ilike to work. Can anyone assist me on this, please? pro...
New
itssasanka
Hi all, Trying to get some more clarity over utc_datetime and naive_datetime for Ecto: https://hexdocs.pm/ecto/Ecto.Schema.html#module-...
New
jononomo
I am trying to figure out how Mix knows whether the environment is test, dev, or prod -- where is this set? Thanks.
New
electic
Hi, I am new to Elixir. I am trying to use the DateTime component to insert a date into MySQL however the there seems to be no way to fo...
New
belgoros
I’m not a pro in using Regex and can’t figure out why the following behaviour happens, especially if we take into account the difference ...
New
Fl4m3Ph03n1x
About me? ( if you have nothing better to do than reading about some random guy in the internet :stuck_out_tongue: ) Hello all, this is ...
New

Other popular topics Top

JakeBecker
TL;DR: I’ve just released an implementation of Microsoft’s IDE-independent Language Server Protocol for Elixir. It adds language support ...
1140 51847 244
New
dotdotdotPaul
Okay, I'm having a heck of a time trying to figure out how to best handle the validation of belongs_to associations in Ecto. I'm sure I'...
New
openscript
Hello! Sorry for this astonishing simple question, but I’m really stuck. I try to set up the intellij-elixir plugin, but I don’t know ho...
New
sergio_101
I am VERY much an elixir newbie. I have taken one elixir course and one phoenix course on Udemy. During that course, I saw the instructor...
New
KronicDeth
Elixir plugin for JetBrain’s IntelliJ Platform (including Rubymine) This is a plugin that adds support for Elixir to JetBrains IntelliJ...
289 35421 110
New
mcarvalho
What is the difference between System.get_env and Application.get_env? For example, what are best practices to use one versus another.
New
shahryarjb
Hello, I have map which I want to convert it to string like this: the map: %{last_name: "tavakkoli", name: "shahryar"} the string I ne...
New
fireproofsocks
Forgive me if this is obvious, but how does one delete a database record WITHOUT selecting it first? https://hexdocs.pm/ecto/Ecto.Repo.h...
New
TunkShif
This post is an instruction guide to help you setup your Neovim for Elixir development from scratch. It includes general information on h...
273 38985 115
New
romenigld
I am trying to run a deploy with docker and I successfully runned with this command: docker build -t romenigld/blog-prod . but when I t...
New

We're in Beta

About us Mission Statement