fceruti
Sup ppl, I just wanted to share a little macro I created to simplify LiveView code. It allows you to convert
socket.assings.variable
into
~a|variable|
For instance here’s a function from Chris McCord’s live_trek
def handle_event("delete", %{"id" => id}, socket) do
todo = Todos.get_todo!(socket.assigns.scope, id)
{:ok, _} = Todos.delete_todo(socket.assigns.scope, todo)
{:noreply, socket}
end
Would be
def handle_event("delete", %{"id" => id}, socket) do
todo = Todos.get_todo!(~a|scope|, id)
{:ok, _} = Todos.delete_todo(~a|scope|, todo)
{:noreply, socket}
end
Necessary? Not really.
But I thought it looks much better, specially when you have lot’s of socket.assigns and want to reduce verbosit, avoid unpacking assigns and reduce formatter line breaks.
Here’s v0.1
defmacro sigil_a(expr, _modifiers) do
socket = Macro.var(:socket, nil)
quote do
Map.get(unquote(socket).assigns, String.to_existing_atom(unquote(expr)))
end
end
And here’s a vim command to search and replace:
:%s/socket\.assigns\.\([a-zA-Z0-9_]*\)/\~a|\1|
Trending in Guides/Tuts
# ~/src/livebook/.iex.exs
System.cmd("xdg-open", [ LivebookWeb.Endpoint.access_url() ] )
Because Livebook requires a unique passcode on ...
New
You probably already know that <span>{nil}</span> in a HEEX template produces <span> </span> when rendered. I fin...
New
Other Trending Topics
I am happy to introduce the very α version of the new programming language compiled to BEAM.
Welcome Cure.
It has literally three kille...
New
Hobbes is a low-level distributed database for the Elixir programming language.
Hobbes provides a simple, safe, and scalable storage lay...
New
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
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New
Xamal is a deployment tool for Elixir apps that deploys native releases to bare metal servers over SSH. It’s a port of GitHub - basecamp/...
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
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #library
- #deployment
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #elixirconf
- #channels
- #exunit
- #discussion
- #code-sync
- #podcasts
- #javascript
- #onsite
- #dialyzer
- #docker
- #authentication
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #elixirconf-us
- #blog-post
- #ai
- #elixir-ls
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #api
- #forms
- #hex
- #security
- #metaprogramming










Showing Posts 1 to 10- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
tfwright
Nice idea. Curious, why Map.get rather than fetch? I think the behavior being replaced raises if the expected key is missing, whereas this will return nil I think
fceruti
No reason, probably a bug
ityonemo
zachallaun
If you wanted to be really evil, you could overload the
@operator if the caller environment containssocket(don’t do this)
v0idpwn
This would have a lot of potential if there were good overridable unary operators in Elixir.
Unfortunately,
.
+,-,!,^,not,@,&are too useful and meaningful to be overriden. There is~~~but its ugly and too hard to writeMakes me think Elixir maybe could support an unary
$operator.ityonemo
I mean, it’s what happens in EEx templates, though!
cmo
$is being used for the potential new type systemtheodore
Pretty cool!
sodapopcan
Innnnnteresting. I was trying to figure out how to do something like this and couldn’t figure it out. I was trying to use
var!/2for this to no avail. I never understood that you can check the caller env.I was looking to create a single guard that would work on both
socketandassigns. I have a lot of single module CRUD LiveViews so I wanted something like:This would check whichever existed of
socket.assigns.live_actionorassigns.live_actionwas in[:edit].Even though I don’t think that is particularly evil (that is, what I wanted to do—what you’re suggesting is absolutely pure evil
) , I ultimately decided I’d rather not do anything out the ordinary like this so I never bothered to seek help figuring it out, but it’s nice to know how it could be done, so thanks!
(that is, if that would even solve the problem… I haven’t actually tried, just responded immediately, lol, but still informative for me)
zachallaun
Glad it was informative!
It’s definitely worth digging into the environment info you have available in macros. Even in the OP’s example, you could check the caller env for a socket var and raise an informative error if it doesn’t exist (as opposed to the underlying Map.fetch! error or whatever you end up using).