Sebb
I want to load a json (list of objects) into list of structs in a module attribute.
Seems like I need three modules for that.
json
[
{"foo": 1, "bar": 2},
{"foo": 11, "bar": 22}
]
struct
defmodule Foo do
defstruct [:foo, :bar]
end
load into struct, note that function in reality is too complex to be added to Foos/@foos - pipe
defmodule JsonLoader do
def load_foos(foos) do
Enum.map(foos, &struct(Foo, &1))
end
end
module that stores the structs in a module attribute.
defmodule Foos do
@foos File.read!("lib/foos.json") |> Jason.decode!(keys: :atoms) |> JsonLoader.load_foos()
def get_foo(foo) do
Enum.find(@foos, fn f -> f.foo == foo end)
end
end
Is there way to bring all that into one module (Foo).
Trending in Questions
Hello!
Suppose you are building workflow (order / task / payment) processing system with the following requirements:
Each workflow con...
New
I’m in search of an Elixir library that offers PDF generation capabilities similar to Ruby’s Prawn. While there have been discussions abo...
New
I’m looking to build a personal workflow to quickly deploy web applications written in elixir/phoenix, for local consumption (ie not on t...
New
Hey guys,
I’ve got a huge CSV ( around 10 GB ) that needs to be processed hourly
Do you guys have any suggestions what is the best prac...
New
Before I dive in myself, did anyone successfully sprinkle Hologram into their existing LiveView app?
Looking for hints regarding:
Addi...
New
Kia ora,
We have been using elixir-google-api to connect to Google Drive. However, with the updates to Tesla due to CVEs this is now bro...
New
I’ve followed the Phoenix LiveView file upload code here Uploads — Phoenix LiveView v1.0.0-rc.7 and so far everything works just fine wit...
New
Other Trending Topics
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
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
ExRatatui lets you cook up rich terminal UIs in Elixir, powered by Rust’s ratatui via Rustler NIFs. Build interactive terminal applicatio...
New
Corex is an accessible, unstyled UI component library for Phoenix that integrates Zag.js state machines using Vanilla JavaScript and Live...
New
Hello everyone. After busy few months I am happy to announce v0.1.0 of Emerge & Solve.
They are GUI (Emerge) and State management (S...
New
Emily is an Elixir library that runs Nx computations on Apple’s MLX. Install it as the default Nx backend and Nx, defn, Axon, Nx.Serving,...
New
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #deployment
- #library
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #channels
- #elixirconf
- #exunit
- #discussion
- #code-sync
- #javascript
- #podcasts
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixir-ls
- #blog-post
- #phoenix_html
- #ai
- #iex
- #graphql
- #elixirconf-us
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #hex
- #security
- #metaprogramming










Showing Posts 1 to 5- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
LostKobrakai
There is not. You can neither execute functions of a module within its own module body nor create structs of the to be compiled module at compile time. Both the struct definition as well as the function will only be available once the module is fully compiled. At the time you provide the module attribute value the module is still being compiled.
The best you can do is 2 modules. One for the struct and one with the module attribute, by inlining the code of
load_foos.Sebb
OK thank you. I expected that, just wanted to make sure. Often there is some magic hidden I do not know.
aziz
I’d like to challenge that claim.
So you can’t use the
structfunction but that’s a small price to pay if you really want/need to do this.Sebb
nice. So you can use
__MODULE__, but not%__MODULE__{}Still, I’ll stay with the 3 Module approach,
&Map.put(&1, :__struct__, __MODULE__)- looks a little cryptic and hacky. I also can’t inline the function that creates the struct because there is too much going on. (I could still preprocess the json, but I don’t want to do that).LostKobrakai
The first is just a dump alias for the current module name. The second is creating a struct, which does do things like checking keys, and such, which does fail without the struct being defined.
&Map.put(&1, :__struct__, __MODULE__)just uses knowledge about implementation details of structs to construct them without doing all the consistency checks structs have when being constructed otherwise.