augnustin

augnustin

Protocol @fallback_to_any true not working as expected: making methods optional

Hello,

I want to have a protocol with 3 methods with 2 optional having the following logic:

defprotocol MyRepo.Render do
  @fallback_to_any true
  def to_string(data)
  def to_index_string(data)
  def to_show_string(data)
end

# some custom implementations

defimpl MyRepo.Render, for: Any do
  def to_index_string(data), do: MyRepo.Render.to_string(data)
  def to_show_string(data), do: MyRepo.Render.to_string(data)
  def to_string(data), do: MyRepo.Render.to_index_string(data) || "#{inspect data}"
end

So that I can have for some data structures:

  defimpl MyApp.Render, for: __MODULE__ do
    def to_index_string(data) do
      "get something"
    end

    def to_show_string(booklet_1) do
      "get something else"
    end
  end

And for others:

  defimpl MyApp.Render, for: __MODULE__ do
    def to_string(data) do
      "get something general"
    end
  end

It seems like for modules with no def impl is present, it works as expected, but when I define either to_index_string and to_show_string or to_string, the compiler complains that the other methods are missing:

** (UndefinedFunctionError) function MyRepo.Render.MyApp.MyDataStruct.to_show_string/1 is undefined or private, but the behaviour MyRepo.Render expects it to be present. Did you mean one of:

      * to_string/1

    (vae) MyRepo.Render.MyApp.MyDataStruct.to_show_string(%MyApp.MyDataStruct{})

How can I achieve what I want?

Thanks

Most Liked

augnustin

augnustin

Thanks @NobbZ for getting back!

Wow, this feels like a limitation, doesn’t it?

Ain’t there any solution so I can circumvent my problem? Like using something else than defprotocol?

benwilson512

benwilson512

Author of Craft GraphQL APIs in Elixir with Absinthe

You can do this explicitly with relative ease by just defdelegateing the functions you don’t want to implement to the Any implementation. EG: defdelegate to_index_string, to: MyRepo.Render.Any.

OvermindDL1

OvermindDL1

Yep mine can do it. ProtocolEx supports not just implementation on specific types but even specific matchspecs so you could match even on specific values if you want (with a full priority system), along with features of being able to inline the implementations into a single module if you need absolute speed, supports optional callbacks, fallback callbacks, a testing structure, etc… And of course all of the extra stuff is optional.

But yeah, if all you need is ‘just’ an optional kind of thing, defdelegate is easy enough to use at each site, which can be wrapped up in a use with override and so forth perhaps?

Where Next?

Popular in Questions Top

jay1
Why is it that the mnesia database isn’t the most preferred database for use in Elixir/Phoenix?
New
stefanluptak
Hello everybody, usually, I use a 29" ultra-wide monitor for VSCode which can easily accomodate explorer (files panel) + file with code ...
New
vrod
I am using the Starship cross-shell prompt – it seems pretty nice, but I get some errors: [WARN] - (starship::utils): Executing command ...
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
JDanielMartinez
Hi! May someone helps me, please! I have two apps into an umbrella project: the first one is Database, which manages queries, and the se...
New
script
If I have a string “1000 cfu/ml” . I want to remove the characters and / and space . So the string is like this "1000" What is the ...
New
WestKeys
Currently suffering from paralysis by [HTTP client] analysis. This is rather unusual in Elixirland as there tends to be consensus on the ...
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
PeterCarter
There are pre-rolled solutions for other frameworks that do work. However, Phoenix does not seem to have these. Have people had good expe...
New
jononomo
For some reason my phoenix channels are working for me in my local dev environment, but as soon as I deploy via Docker, I get a 403 error...
New

Other popular topics Top

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
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
chrismccord
This release brings a number of exciting features, including integration with the new Phoenix LiveDashboard and Phoenix LiveView. There h...
New
hariharasudhan94
lets say i have a sample like a = 20; b = 10; if (a > b) do {:ok, "a"} end if (a < b) do {:ok, b} end if (a == b) do {:ok, "equa...
New
vonH
When I run the Plug and I recompile I wind up having to use Ctrl C to quit iex and start again. Witht the help of rlwrap I can use the cu...
New
gausby
I asked this very same question on twitter and got some interesting feedback, but I thought it would be a good question to ask here as we...
1207 39297 209
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
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
marick
I had some trouble figuring out how to make many-to-many associations work. Once I got it working, I wrote a blog post. Because I’m a nov...
New
dogweather
I wrote this comment on r/haskell, and it’s not popular there. :wink: But I think I’m on to something… Haskell reminds me of Java, and e...
New

We're in Beta

About us Mission Statement