@@ -47,6 +47,8 @@ defmodule BexioApiClient.SearchCriteria do
4747 @ derive Jason.Encoder
4848 defstruct [ :field , :criteria , :value ]
4949
50+ @ regex ~r/ ^(?<field>\S +)\s *(?<operator>!=|=|<=|<|>=|>|in|not in|like|not like|is nil|is not nil)\s *(?<value>.*)$/
51+
5052 defp new ( field , criteria , value ) do
5153 % __MODULE__ {
5254 field: field ,
@@ -55,6 +57,43 @@ defmodule BexioApiClient.SearchCriteria do
5557 }
5658 end
5759
60+ @ spec sigil_f ( String . t ( ) , Keyword . t ( ) ) :: t ( )
61+ def sigil_f ( field , opts )
62+
63+ def sigil_f ( expression , _opts ) do
64+ case Regex . run ( @ regex , expression , capture: :all_but_first ) do
65+ nil -> raise ArgumentError , "Invalid search criteria: #{ expression } "
66+ [ field , operator , value ] -> handle ( field , operator , value )
67+ end
68+ end
69+
70+ defp handle ( field , operator , value ) when is_binary ( field ) ,
71+ do: handle ( String . to_existing_atom ( field ) , operator , value )
72+
73+ defp handle ( field , "=" , value ) when is_atom ( field ) , do: equal ( field , value )
74+ defp handle ( field , "!=" , value ) when is_atom ( field ) , do: not_equal ( field , value )
75+ defp handle ( field , "<" , value ) when is_atom ( field ) , do: less_than ( field , value )
76+ defp handle ( field , "<=" , value ) when is_atom ( field ) , do: less_equal ( field , value )
77+ defp handle ( field , ">" , value ) when is_atom ( field ) , do: greater_than ( field , value )
78+ defp handle ( field , ">=" , value ) when is_atom ( field ) , do: greater_equal ( field , value )
79+ defp handle ( field , "like" , value ) when is_atom ( field ) , do: like ( field , value )
80+ defp handle ( field , "not like" , value ) when is_atom ( field ) , do: not_like ( field , value )
81+ defp handle ( field , "is nil" , _value ) when is_atom ( field ) , do: nil? ( field )
82+ defp handle ( field , "is not nil" , _value ) when is_atom ( field ) , do: not_nil? ( field )
83+ defp handle ( field , "in" , value ) when is_atom ( field ) , do: part_of ( field , listify ( value ) )
84+ defp handle ( field , "not in" , value ) when is_atom ( field ) , do: not_part_of ( field , listify ( value ) )
85+
86+ defp handle ( field , operator , value ) ,
87+ do:
88+ raise ( ArgumentError , "Invalid operator: #{ operator } for field #{ field } and value #{ value } " )
89+
90+ defp listify ( value ) do
91+ case ~r/ ^\[ (?<value>.*)\] $/ |> Regex . named_captures ( value ) do
92+ % { "value" => value } -> String . split ( value , "," )
93+ nil -> [ value ]
94+ end
95+ end
96+
5897 @ doc "Creates a = search criteria"
5998 @ spec equal ( atom ( ) , any ( ) ) :: t ( )
6099 def equal ( field , value ) , do: new ( field , := , value )
0 commit comments