1
1
-module (gleam_stdlib ).
2
2
3
3
-export ([
4
- map_get /2 , iodata_append /2 , identity /1 , decode_int /1 , decode_bool /1 ,
5
- decode_float /1 , decode_list /1 , decode_option /2 , decode_field /2 , parse_int /1 ,
6
- parse_float /1 , less_than /2 , string_pop_grapheme /1 , string_pop_codeunit /1 ,
4
+ map_get /2 , iodata_append /2 , identity /1 , parse_int /1 , parse_float /1 ,
5
+ less_than /2 , string_pop_grapheme /1 , string_pop_codeunit /1 ,
7
6
string_starts_with /2 , wrap_list /1 , string_ends_with /2 , string_pad /4 ,
8
- decode_map /1 , uri_parse /1 , decode_result /1 , bit_array_slice /3 ,
9
- decode_bit_array /1 , percent_encode /1 , percent_decode /1 , base_decode64 /1 ,
10
- parse_query /1 , bit_array_concat /1 , bit_array_base64_encode /2 ,
11
- size_of_tuple /1 , decode_tuple /1 , decode_tuple2 /1 , decode_tuple3 /1 ,
12
- decode_tuple4 /1 , decode_tuple5 /1 , decode_tuple6 /1 , tuple_get /2 ,
13
- classify_dynamic /1 , print /1 , println /1 , print_error /1 , println_error /1 ,
14
- inspect /1 , float_to_string /1 , int_from_base_string /2 ,
7
+ uri_parse /1 , bit_array_slice /3 , percent_encode /1 , percent_decode /1 ,
8
+ base_decode64 /1 , parse_query /1 , bit_array_concat /1 ,
9
+ bit_array_base64_encode /2 , size_of_tuple /1 ,
10
+ tuple_get /2 , classify_dynamic /1 , print /1 , println /1 , print_error /1 ,
11
+ println_error /1 , inspect /1 , float_to_string /1 , int_from_base_string /2 ,
15
12
utf_codepoint_list_to_string /1 , contains_string /2 , crop_string /2 ,
16
13
base16_encode /1 , base16_decode /1 , string_replace /3 , slice /3 ,
17
- bit_array_to_int_and_size /1 , bit_array_pad_to_bytes /1
14
+ bit_array_to_int_and_size /1 , bit_array_pad_to_bytes /1 , index /2 , list /5 ,
15
+ dict /1 , int /1 , float /1 , bit_array /1 , is_null /1
18
16
]).
19
17
20
18
% % Taken from OTP's uri_string module
@@ -46,11 +44,6 @@ iodata_append(Iodata, String) -> [Iodata, String].
46
44
47
45
identity (X ) -> X .
48
46
49
- decode_error_msg (Expected , Data ) when is_binary (Expected ) ->
50
- decode_error (Expected , classify_dynamic (Data )).
51
- decode_error (Expected , Got ) when is_binary (Expected ) andalso is_binary (Got ) ->
52
- {error , [{decode_error , Expected , Got , []}]}.
53
-
54
47
classify_dynamic (nil ) -> <<" Nil" >>;
55
48
classify_dynamic (X ) when is_boolean (X ) -> <<" Bool" >>;
56
49
classify_dynamic (X ) when is_atom (X ) -> <<" Atom" >>;
@@ -70,88 +63,12 @@ classify_dynamic(X) when
70
63
is_function (X , 12 ) -> <<" Function" >>;
71
64
classify_dynamic (_ ) -> <<" Some other type" >>.
72
65
73
- decode_map (Data ) when is_map (Data ) -> {ok , Data };
74
- decode_map (Data ) -> decode_error_msg (<<" Dict" >>, Data ).
75
-
76
- decode_bit_array (Data ) when is_bitstring (Data ) -> {ok , Data };
77
- decode_bit_array (Data ) -> decode_error_msg (<<" BitArray" >>, Data ).
78
-
79
- decode_int (Data ) when is_integer (Data ) -> {ok , Data };
80
- decode_int (Data ) -> decode_error_msg (<<" Int" >>, Data ).
81
-
82
- decode_float (Data ) when is_float (Data ) -> {ok , Data };
83
- decode_float (Data ) -> decode_error_msg (<<" Float" >>, Data ).
84
-
85
- decode_bool (Data ) when is_boolean (Data ) -> {ok , Data };
86
- decode_bool (Data ) -> decode_error_msg (<<" Bool" >>, Data ).
87
-
88
- decode_list (Data ) when is_list (Data ) -> {ok , Data };
89
- decode_list (Data ) -> decode_error_msg (<<" List" >>, Data ).
90
-
91
- decode_field (Data , Key ) when is_map (Data ) ->
92
- case Data of
93
- #{Key := Value } -> {ok , {some , Value }};
94
- _ ->
95
- {ok , none }
96
- end ;
97
- decode_field (Data , _ ) ->
98
- decode_error_msg (<<" Dict" >>, Data ).
99
-
100
66
size_of_tuple (Data ) -> tuple_size (Data ).
101
67
102
68
tuple_get (_tup , Index ) when Index < 0 -> {error , nil };
103
69
tuple_get (Data , Index ) when Index >= tuple_size (Data ) -> {error , nil };
104
70
tuple_get (Data , Index ) -> {ok , element (Index + 1 , Data )}.
105
71
106
- decode_tuple (Data ) when is_tuple (Data ) -> {ok , Data };
107
- decode_tuple (Data ) -> decode_error_msg (<<" Tuple" >>, Data ).
108
-
109
- decode_tuple2 ({_ ,_ } = A ) -> {ok , A };
110
- decode_tuple2 ([A ,B ]) -> {ok , {A ,B }};
111
- decode_tuple2 (Data ) -> decode_error_msg (<<" Tuple of 2 elements" >>, Data ).
112
-
113
- decode_tuple3 ({_ ,_ ,_ } = A ) -> {ok , A };
114
- decode_tuple3 ([A ,B ,C ]) -> {ok , {A ,B ,C }};
115
- decode_tuple3 (Data ) -> decode_error_msg (<<" Tuple of 3 elements" >>, Data ).
116
-
117
- decode_tuple4 ({_ ,_ ,_ ,_ } = A ) -> {ok , A };
118
- decode_tuple4 ([A ,B ,C ,D ]) -> {ok , {A ,B ,C ,D }};
119
- decode_tuple4 (Data ) -> decode_error_msg (<<" Tuple of 4 elements" >>, Data ).
120
-
121
- decode_tuple5 ({_ ,_ ,_ ,_ ,_ } = A ) -> {ok , A };
122
- decode_tuple5 ([A ,B ,C ,D ,E ]) -> {ok , {A ,B ,C ,D ,E }};
123
- decode_tuple5 (Data ) -> decode_error_msg (<<" Tuple of 5 elements" >>, Data ).
124
-
125
- decode_tuple6 ({_ ,_ ,_ ,_ ,_ ,_ } = A ) -> {ok , A };
126
- decode_tuple6 ([A ,B ,C ,D ,E ,F ]) -> {ok , {A ,B ,C ,D ,E ,F }};
127
- decode_tuple6 (Data ) -> decode_error_msg (<<" Tuple of 6 elements" >>, Data ).
128
-
129
- decode_option (Term , F ) ->
130
- Decode = fun (Inner ) ->
131
- case F (Inner ) of
132
- {ok , Decoded } -> {ok , {some , Decoded }};
133
- Error -> Error
134
- end
135
- end ,
136
- case Term of
137
- undefined -> {ok , none };
138
- error -> {ok , none };
139
- null -> {ok , none };
140
- none -> {ok , none };
141
- nil -> {ok , none };
142
- {some , Inner } -> Decode (Inner );
143
- _ -> Decode (Term )
144
- end .
145
-
146
- decode_result (Term ) ->
147
- case Term of
148
- {ok , Inner } -> {ok , {ok , Inner }};
149
- ok -> {ok , {ok , nil }};
150
- {error , Inner } -> {ok , {error , Inner }};
151
- error -> {ok , {error , nil }};
152
- _ -> decode_error_msg (<<" Result" >>, Term )
153
- end .
154
-
155
72
int_from_base_string (String , Base ) ->
156
73
case catch binary_to_integer (String , Base ) of
157
74
Int when is_integer (Int ) -> {ok , Int };
@@ -534,3 +451,69 @@ slice(String, Index, Length) ->
534
451
X when is_binary (X ) -> X ;
535
452
X when is_list (X ) -> unicode :characters_to_binary (X )
536
453
end .
454
+
455
+
456
+ index ([X | _ ], 0 ) ->
457
+ {ok , {some , X }};
458
+ index ([_ , X | _ ], 1 ) ->
459
+ {ok , {some , X }};
460
+ index ([_ , _ , X | _ ], 2 ) ->
461
+ {ok , {some , X }};
462
+ index ([_ , _ , _ , X | _ ], 3 ) ->
463
+ {ok , {some , X }};
464
+ index ([_ , _ , _ , _ , X | _ ], 4 ) ->
465
+ {ok , {some , X }};
466
+ index ([_ , _ , _ , _ , _ , X | _ ], 5 ) ->
467
+ {ok , {some , X }};
468
+ index ([_ , _ , _ , _ , _ , _ , X | _ ], 6 ) ->
469
+ {ok , {some , X }};
470
+ index ([_ , _ , _ , _ , _ , _ , _ , X | _ ], 7 ) ->
471
+ {ok , {some , X }};
472
+ index (Tuple , Index ) when is_tuple (Tuple ) andalso is_integer (Index ) ->
473
+ {ok , try
474
+ {some , element (Index + 1 , Tuple )}
475
+ catch _ :_ ->
476
+ none
477
+ end };
478
+ index (Map , Key ) when is_map (Map ) ->
479
+ {ok , try
480
+ {some , maps :get (Key , Map )}
481
+ catch _ :_ ->
482
+ none
483
+ end };
484
+ index (_ , Index ) when is_integer (Index ) ->
485
+ {error , <<" Indexable" >>};
486
+ index (_ , _ ) ->
487
+ {error , <<" Dict" >>}.
488
+
489
+ list (T , A , B , C , D ) when is_tuple (T ) ->
490
+ list (tuple_to_list (T ), A , B , C , D );
491
+ list ([], _ , _ , _ , Acc ) ->
492
+ {lists :reverse (Acc ), []};
493
+ list ([X | Xs ], Decode , PushPath , Index , Acc ) ->
494
+ {Out , Errors } = Decode (X ),
495
+ case Errors of
496
+ [] -> list (Xs , Decode , PushPath , Index + 1 , [Out | Acc ]);
497
+ _ -> PushPath ({[], Errors }, integer_to_binary (Index ))
498
+ end ;
499
+ list (Unexpected , _ , _ , _ , []) ->
500
+ Found = gleam@dynamic :classify (Unexpected ),
501
+ Error = {decode_error , <<" List" /utf8 >>, Found , []},
502
+ {[], [Error ]};
503
+ list (_ , _ , _ , _ , Acc ) ->
504
+ {lists :reverse (Acc ), []}.
505
+
506
+ dict (#{} = Data ) -> {ok , Data };
507
+ dict (_ ) -> {error , nil }.
508
+
509
+ int (I ) when is_integer (I ) -> {ok , I };
510
+ int (_ ) -> {error , 0 }.
511
+
512
+ float (F ) when is_float (F ) -> {ok , F };
513
+ float (_ ) -> {error , 0.0 }.
514
+
515
+ bit_array (B ) when is_bitstring (B ) -> {ok , B };
516
+ bit_array (_ ) -> {error , <<>>}.
517
+
518
+ is_null (X ) ->
519
+ X =:= undefined orelse X =:= null orelse X =:= nil .
0 commit comments