Skip to content

Commit ffbe612

Browse files
author
Ryan Miville
committed
add optional_opt
1 parent 9b6f2f5 commit ffbe612

File tree

3 files changed

+43
-3
lines changed

3 files changed

+43
-3
lines changed

gleam.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name = "clad"
2-
version = "1.0.1"
2+
version = "1.1.0"
33

44
# Fill out these fields if you intend to generate HTML documentation or publish
55
# your project to the Hex package manager.

src/clad.gleam

+26-2
Original file line numberDiff line numberDiff line change
@@ -213,10 +213,34 @@ pub fn flag(
213213
short_name: String,
214214
next: fn(Bool) -> Decoder(final),
215215
) -> Decoder(final) {
216-
use value <- optional_field(long_name, decode.bool)
216+
optional_opt(long_name, short_name, False, decode.bool, next)
217+
}
218+
219+
/// Decode a command line option by either a long name or short name.
220+
/// The given default value is returned if the option does not exist.
221+
/// ```gleam
222+
/// let decoder = {
223+
/// use name <- clad.optional_opt("name", "n", "Lucy", decode.string)
224+
/// decode.success(name)
225+
/// }
226+
///
227+
/// let result = clad.decode(["--name", "Joe"], decoder)
228+
/// assert result == Ok("Joe")
229+
///
230+
/// let result = clad.decode([], decoder)
231+
/// assert result == Ok("Lucy")
232+
/// ```
233+
pub fn optional_opt(
234+
long_name: String,
235+
short_name: String,
236+
default: t,
237+
field_decoder: Decoder(t),
238+
next: fn(t) -> Decoder(final),
239+
) -> Decoder(final) {
240+
use value <- optional_field(long_name, field_decoder)
217241
case value {
218242
Some(v) -> next(v)
219-
None -> decode.optional_field(short_name, False, decode.bool, next)
243+
None -> decode.optional_field(short_name, default, field_decoder, next)
220244
}
221245
}
222246

test/clad_test.gleam

+16
Original file line numberDiff line numberDiff line change
@@ -210,3 +210,19 @@ pub fn list_test() {
210210
clad.decode([], decoder)
211211
|> should.be_error
212212
}
213+
214+
pub fn optional_opt_test() {
215+
let decoder = {
216+
use name <- clad.optional_opt("name", "n", "Lucy", decode.string)
217+
decode.success(name)
218+
}
219+
220+
clad.decode(["--name", "Joe"], decoder)
221+
|> should.equal(Ok("Joe"))
222+
223+
clad.decode(["-n", "Joe"], decoder)
224+
|> should.equal(Ok("Joe"))
225+
226+
clad.decode([], decoder)
227+
|> should.equal(Ok("Lucy"))
228+
}

0 commit comments

Comments
 (0)