-
Notifications
You must be signed in to change notification settings - Fork 1
/
reward.gleam
58 lines (51 loc) · 1.25 KB
/
reward.gleam
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
import gleam/dynamic.{type Decoder, type Dynamic}
import gleam/result
pub type Reward {
Reward(id: String, title: String, cost: Int, prompt: String)
}
pub fn reward_decoder() -> Decoder(Reward) {
dynamic.decode4(
Reward,
dynamic.field("id", dynamic.string),
dynamic.field("title", dynamic.string),
dynamic.field("cost", dynamic.int),
dynamic.field("prompt", dynamic.string),
)
}
pub type Status {
Canceled
Fulfilled
Unfulfilled
Unknown
}
pub fn rewards_status_to_string(reward_status: Status) -> String {
case reward_status {
Canceled -> "canceled"
Fulfilled -> "fulfilled"
Unfulfilled -> "unfulfilled"
Unknown -> "unknown"
}
}
pub fn reward_status_from_string(string: String) -> Result(Status, Nil) {
case string {
"canceled" -> Ok(Canceled)
"fulfilled" -> Ok(Fulfilled)
"unfulfilled" -> Ok(Unfulfilled)
"unknown" -> Ok(Unknown)
_ -> Error(Nil)
}
}
pub fn reward_status_decoder() -> Decoder(Status) {
fn(data: Dynamic) {
use string <- result.try(dynamic.string(data))
string
|> reward_status_from_string
|> result.replace_error([
dynamic.DecodeError(
expected: "RewardsStatus",
found: "String(" <> string <> ")",
path: [],
),
])
}
}