@@ -10,32 +10,39 @@ defmodule ConfigWorkflow do
1010
1111 def validate_field ( data , field , rules ) do
1212 value = Map . get ( data , String . to_atom ( field ) )
13+
1314 cond do
1415 rules [ "required" ] && is_nil ( value ) ->
1516 { :error , "#{ field } is required" }
17+
1618 rules [ "type" ] == "number" && not is_number ( value ) ->
1719 { :error , "#{ field } must be a number" }
20+
1821 rules [ "min" ] && value < rules [ "min" ] ->
1922 { :error , "#{ field } must be at least #{ rules [ "min" ] } " }
23+
2024 true ->
2125 { :ok , value }
2226 end
2327 end
2428
2529 def create_validation_transform ( config ) do
2630 fn signal , state ->
27- result = Enum . reduce_while ( config [ "validate" ] , { :ok , signal . data } , fn rule , { :ok , acc } ->
28- case validate_field ( acc , rule [ "field" ] , rule ) do
29- { :ok , _ } ->
30- { :cont , { :ok , acc } }
31- { :error , reason } ->
32- { :halt , { :error , reason } }
33- end
34- end )
31+ result =
32+ Enum . reduce_while ( config [ "validate" ] , { :ok , signal . data } , fn rule , { :ok , acc } ->
33+ case validate_field ( acc , rule [ "field" ] , rule ) do
34+ { :ok , _ } ->
35+ { :cont , { :ok , acc } }
36+
37+ { :error , reason } ->
38+ { :halt , { :error , reason } }
39+ end
40+ end )
3541
3642 case result do
3743 { :ok , data } ->
3844 { Signal . emit ( :validated , data ) , state }
45+
3946 { :error , reason } ->
4047 { Signal . halt ( reason ) , state }
4148 end
@@ -45,12 +52,15 @@ defmodule ConfigWorkflow do
4552 def create_enrichment_transform ( config ) do
4653 fn signal , state ->
4754 try do
48- enriched_data = Enum . reduce ( config [ "add_fields" ] , signal . data , fn
49- % { "timestamp" => "now()" } , acc ->
50- Map . put ( acc , :timestamp , DateTime . utc_now ( ) )
51- field , acc ->
52- Map . merge ( acc , field )
53- end )
55+ enriched_data =
56+ Enum . reduce ( config [ "add_fields" ] , signal . data , fn
57+ % { "timestamp" => "now()" } , acc ->
58+ Map . put ( acc , :timestamp , DateTime . utc_now ( ) )
59+
60+ field , acc ->
61+ Map . merge ( acc , field )
62+ end )
63+
5464 { Signal . emit ( :enriched , enriched_data ) , state }
5565 rescue
5666 e in RuntimeError -> { Signal . emit ( :error , e . message ) , state }
@@ -59,26 +69,30 @@ defmodule ConfigWorkflow do
5969 end
6070
6171 def create_branch ( config , flows ) do
62- condition = case config [ "condition" ] do
63- "age >= 18" ->
64- fn signal , _ -> Map . get ( signal . data , :age ) >= 18 end
65- end
72+ condition =
73+ case config [ "condition" ] do
74+ "age >= 18" ->
75+ fn signal , _ -> Map . get ( signal . data , :age ) >= 18 end
76+ end
6677
67- then_flow = flows [ config [ "then_flow" ] ]
68- |> Enum . map ( fn step -> create_handler ( step , flows ) end )
78+ then_flow =
79+ flows [ config [ "then_flow" ] ]
80+ |> Enum . map ( fn step -> create_handler ( step , flows ) end )
6981
70- else_flow = flows [ config [ "else_flow" ] ]
71- |> Enum . map ( fn step -> create_handler ( step , flows ) end )
82+ else_flow =
83+ flows [ config [ "else_flow" ] ]
84+ |> Enum . map ( fn step -> create_handler ( step , flows ) end )
7285
7386 Primitives . branch ( condition , then_flow , else_flow )
7487 end
7588
7689 def create_notification ( config ) do
7790 fn signal , state ->
7891 try do
79- message = config [ "message" ]
80- |> String . replace ( "{name}" , to_string ( Map . get ( signal . data , :name ) ) )
81- |> String . replace ( "{age}" , to_string ( Map . get ( signal . data , :age ) ) )
92+ message =
93+ config [ "message" ]
94+ |> String . replace ( "{name}" , to_string ( Map . get ( signal . data , :name ) ) )
95+ |> String . replace ( "{age}" , to_string ( Map . get ( signal . data , :age ) ) )
8296
8397 { Signal . emit ( :notification , message ) , state }
8498 rescue
@@ -91,10 +105,13 @@ defmodule ConfigWorkflow do
91105 case { step [ "type" ] , step [ "name" ] } do
92106 { "transform" , "validate_input" } ->
93107 create_validation_transform ( step [ "config" ] )
108+
94109 { "transform" , "enrich_data" } ->
95110 create_enrichment_transform ( step [ "config" ] )
111+
96112 { "branch" , _ } ->
97113 create_branch ( step [ "config" ] , flows )
114+
98115 { "notify" , _ } ->
99116 create_notification ( step [ "config" ] )
100117 end
@@ -180,7 +197,7 @@ defmodule ConfigWorkflow do
180197 IO . puts ( "\n Using #{ if File . exists? ( yaml_path ) , do: "YAML configuration" , else: "stub data" } " )
181198
182199 # Create handlers from configuration
183- handlers = Enum . map ( workflow [ "steps" ] , & create_handler ( & 1 , workflow [ "flows" ] ) )
200+ handlers = Enum . map ( workflow [ "steps" ] , & create_handler ( & 1 , workflow [ "flows" ] ) )
184201
185202 # Test data
186203 test_cases = [
@@ -200,6 +217,7 @@ defmodule ConfigWorkflow do
200217 case process_with_error_handling ( handlers , signal , state ) do
201218 { :ok , result } ->
202219 IO . puts ( "Success: #{ inspect ( result ) } " )
220+
203221 { :error , reason } ->
204222 IO . puts ( "Error: #{ reason } " )
205223 end
@@ -210,11 +228,15 @@ defmodule ConfigWorkflow do
210228 case Flow . process ( handlers , signal , state ) do
211229 { :ok , result , _ } ->
212230 { :ok , result }
231+
213232 { :error , { :badmap , msg } } ->
214- clean_msg = msg
215- |> String . replace ( ~r/ Transform error: expected a map got: "/ , "" )
216- |> String . replace ( ~r/ "$/ , "" )
233+ clean_msg =
234+ msg
235+ |> String . replace ( ~r/ Transform error: expected a map got: "/ , "" )
236+ |> String . replace ( ~r/ "$/ , "" )
237+
217238 { :error , clean_msg }
239+
218240 { :error , reason } ->
219241 { :error , format_error ( reason ) }
220242 end
0 commit comments