1
- import gleam/bit_array
2
- import gleam/dynamic
1
+ import gleam/dynamic/decode
3
2
import gleam/http/request
4
3
import gleam/http/response
5
4
import gleam/json
@@ -31,14 +30,15 @@ pub fn five_day_forecast_request(api_key, location) {
31
30
}
32
31
33
32
pub fn five_day_forecast_response ( response : response . Response ( BitArray ) ) {
34
- use json <- try (
35
- bit_array . to_string ( response . body )
36
- |> result . replace_error ( snag . new ( "not utf8 encoded" ) ) ,
37
- )
38
- let decoder =
39
- dynamic . field ( "DailyForecasts" , dynamic . list ( daily_forcast_decoder ) )
33
+ let decoder = {
34
+ use daily_forecasts <- decode . field (
35
+ "DailyForecasts" ,
36
+ decode . list ( daily_forcast_decoder ( ) ) ,
37
+ )
38
+ decode . success ( daily_forecasts )
39
+ }
40
40
use message <- try (
41
- json . decode_bits ( response . body , decoder )
41
+ json . parse_bits ( response . body , decoder )
42
42
|> result . map_error ( fn ( reason ) {
43
43
snag . new ( string . inspect ( reason ) )
44
44
|> snag . layer ( "failed to decode message" )
@@ -59,23 +59,41 @@ pub type DailyForecast {
59
59
)
60
60
}
61
61
62
- pub fn daily_forcast_decoder ( raw ) {
63
- dynamic . decode7 (
64
- DailyForecast ,
65
- dynamic . field ( "Date" , dynamic . string ) ,
66
- dynamic . field ( "Sun" , dynamic . field ( "Rise" , dynamic . string ) ) ,
67
- dynamic . field ( "Sun" , dynamic . field ( "Set" , dynamic . string ) ) ,
68
- dynamic . field (
69
- "Temperature" ,
70
- dynamic . field ( "Minimum" , dynamic . field ( "Value" , dynamic . float ) ) ,
71
- ) ,
72
- dynamic . field (
73
- "Temperature" ,
74
- dynamic . field ( "Maximum" , dynamic . field ( "Value" , dynamic . float ) ) ,
75
- ) ,
76
- dynamic . field ( "Day" , detail_decoder ) ,
77
- dynamic . field ( "Night" , detail_decoder ) ,
78
- ) ( raw )
62
+ pub fn daily_forcast_decoder ( ) {
63
+ use date <- decode . field ( "Date" , decode . string )
64
+ use sunrise <- decode . field ( "Sun" , {
65
+ use sunrise <- decode . field ( "Rise" , decode . string )
66
+ decode . success ( sunrise )
67
+ } )
68
+ use sunset <- decode . field ( "Sun" , {
69
+ use sunrise <- decode . field ( "Set" , decode . string )
70
+ decode . success ( sunrise )
71
+ } )
72
+ use minimum_temperature <- decode . field ( "Temperature" , {
73
+ use minimum_temperature <- decode . field ( "Minimum" , {
74
+ use minimum_temperature <- decode . field ( "Value" , decode . float )
75
+ decode . success ( minimum_temperature )
76
+ } )
77
+ decode . success ( minimum_temperature )
78
+ } )
79
+ use maximum_temperature <- decode . field ( "Temperature" , {
80
+ use minimum_temperature <- decode . field ( "Maximum" , {
81
+ use minimum_temperature <- decode . field ( "Value" , decode . float )
82
+ decode . success ( minimum_temperature )
83
+ } )
84
+ decode . success ( minimum_temperature )
85
+ } )
86
+ use day <- decode . field ( "Day" , detail_decoder ( ) )
87
+ use night <- decode . field ( "Night" , detail_decoder ( ) )
88
+ decode . success ( DailyForecast (
89
+ date ,
90
+ sunrise ,
91
+ sunset ,
92
+ minimum_temperature ,
93
+ maximum_temperature ,
94
+ day ,
95
+ night ,
96
+ ) )
79
97
}
80
98
81
99
pub type Detail {
@@ -86,17 +104,24 @@ pub type Detail {
86
104
)
87
105
}
88
106
89
- fn detail_decoder ( raw ) {
90
- dynamic . decode3 (
91
- Detail ,
92
- dynamic . field ( "PrecipitationProbability" , dynamic . int ) ,
93
- dynamic . field (
94
- "Wind" ,
95
- dynamic . field ( "Speed" , dynamic . field ( "Value" , dynamic . float ) ) ,
96
- ) ,
97
- dynamic . field (
98
- "Wind" ,
99
- dynamic . field ( "Direction" , dynamic . field ( "English" , dynamic . string ) ) ,
100
- ) ,
101
- ) ( raw )
107
+ fn detail_decoder ( ) {
108
+ use precipitation_probability <- decode . field (
109
+ "PrecipitationProbability" ,
110
+ decode . int ,
111
+ )
112
+ use wind_speed <- decode . field ( "Wind" , {
113
+ use wind_speed <- decode . field ( "Speed" , {
114
+ use wind_speed <- decode . field ( "Value" , decode . float )
115
+ decode . success ( wind_speed )
116
+ } )
117
+ decode . success ( wind_speed )
118
+ } )
119
+ use wind_direction <- decode . field ( "Wind" , {
120
+ use wind_direction <- decode . field ( "Direction" , {
121
+ use wind_direction <- decode . field ( "English" , decode . string )
122
+ decode . success ( wind_direction )
123
+ } )
124
+ decode . success ( wind_direction )
125
+ } )
126
+ decode . success ( Detail ( precipitation_probability , wind_speed , wind_direction ) )
102
127
}
0 commit comments