
Fl4m3Ph03n1x
How to convert a typed definition to a typedstruct?
Background
I am moving towards defined data structures in my application, and I find that TypedStruct is quite useful.
Questions
However, I have recently found a little hickup. I don’t know how to convert this definition into a typedstruct:
@type order_info :: %{
(visible :: String.t()) => boolean,
(order_type :: String.t()) => String.t(),
(platform :: String.t()) => String.t(),
(platinum :: String.t()) => non_neg_integer,
(user :: String.t()) => %{
(ingame_name :: String.t()) => String.t(),
(status :: String.t()) => String.t()
}
}
My main issue here is the user
map. Aside from the fact I don’t know how to define a typedstruct inside a trypedstruct, how do you folks do this?
- Do you simply define a map inside the
order_info
typedstruct and ignore the mandatory parameters for theuser
map? - Do you create another typedstruct (called
user
) that goes inside the typedsctruct calledorder_info
? - What is the standard option in Elixir ?
Marked As Solved

Fl4m3Ph03n1x
Answer
After talking with other folks at the community I have opted for separating the User into a struct, in its own module, inside an OrderInfo
directory:
lib/
order_info/
user.ex
order_info.ex
I personally find this works great for readability. So for readability purposes this is what I ended up with:
defmodule AuctionHouse.Data.OrderInfo.User do
@moduledoc """
Represents the account information for a User.
"""
use TypedStruct
alias AuctionHouse.Shared.Utils
@type user :: %{
(ingame_name :: String.t()) => String.t(),
(status :: String.t()) => String.t()
}
typedstruct enforce: true do
@typedoc "Account information of an User"
field(:ingame_name, String.t())
field(:status, String.t())
end
@spec new(user) :: __MODULE__.t()
def new(
%{
"ingame_name" => ingame_name,
"status" => status
} = user
)
when is_binary(ingame_name) and is_binary(status),
do: Utils.string_map_to_struct(user, __MODULE__)
end
An then OrderInfo
is basically the same, as seen by this typedstruct definition:
typedstruct enforce: true do
@typedoc "Information about an order"
field(:visible, boolean())
field(:order_type, String.t())
field(:platform, String.t())
field(:platinum, non_neg_integer())
field(:user, __MODULE__.User.t())
end
Extra
One thing to mention here, is that struct
will not convert string maps to structures, only atom maps. So in order to achieve my goal of converting string maps to structures, I created this little helper function:
defmodule AuctionHouse.Shared.Utils do
@moduledoc """
Set of functions used across the app, for utility purposes, like dealing with
tuples, maps and other data structures.
"""
alias Morphix
@spec string_map_to_struct(data :: map, target_struct :: module | struct) ::
target_struct :: struct
def string_map_to_struct(data, target_struct) do
data
|> Morphix.atomorphiform!()
|> data_to_struct(target_struct)
end
@spec data_to_struct(data :: Enumerable.t(), target_struct :: module | struct) ::
target_struct :: struct
def data_to_struct(data, target_struct), do: struct(target_struct, data)
end
Here I used Morphix to do the hard work, but this can also be achieved by other means, see:
Many thanks to all of the people who helped me get this far, from other communities as well:
Popular Backend topics










Other popular topics










Latest in Backend
Latest (all)
Categories:
Popular Portals
- /elixir
- /rust
- /wasm
- /ruby
- /erlang
- /phoenix
- /keyboards
- /js
- /rails
- /python
- /security
- /go
- /swift
- /vim
- /clojure
- /java
- /haskell
- /emacs
- /svelte
- /onivim
- /typescript
- /crystal
- /c-plus-plus
- /tailwind
- /kotlin
- /gleam
- /react
- /flutter
- /elm
- /ocaml
- /vscode
- /opensuse
- /ash
- /centos
- /php
- /deepseek
- /scala
- /zig
- /html
- /debian
- /nixos
- /lisp
- /agda
- /sublime-text
- /textmate
- /react-native
- /kubuntu
- /arch-linux
- /ubuntu
- /revery
- /manjaro
- /spring
- /django
- /diversity
- /nodejs
- /lua
- /julia
- /c
- /slackware
- /neovim