Packages
caffeine_lang
3.0.2
6.3.1
6.3.0
6.2.2
6.2.1
6.2.0
6.1.2
6.1.1
6.1.0
6.0.0
5.6.0
5.5.0
5.4.4
5.4.3
5.4.2
5.4.1
5.4.0
5.3.0
5.2.0
5.1.1
5.1.0
5.0.12
5.0.11
5.0.10
5.0.8
5.0.7
5.0.6
5.0.5
5.0.4
5.0.1
5.0.0
4.10.0
4.9.0
4.8.3
4.8.2
4.8.1
4.8.0
4.7.9
4.7.8
4.7.7
4.7.6
4.7.5
4.6.7
4.6.6
4.6.5
4.6.4
4.6.3
4.6.2
4.6.0
4.5.1
4.5.0
4.4.4
4.4.3
4.4.1
4.4.0
4.3.7
4.3.6
3.0.6
3.0.5
3.0.4
3.0.3
3.0.2
3.0.1
3.0.0
2.0.5
2.0.4
2.0.3
2.0.2
2.0.1
2.0.0
1.0.2
1.0.1
0.1.0
0.0.24
0.0.23
0.0.22
0.0.21
0.0.20
0.0.19
0.0.18
0.0.17
0.0.16
0.0.15
0.0.14
0.0.13
0.0.12
0.0.11
0.0.10
0.0.9
0.0.8
0.0.7
0.0.6
0.0.5
0.0.4
0.0.2
0.0.1
A compiler for generating reliability artifacts from service expectation definitions.
Current section
Files
Jump to
Current section
Files
src/caffeine_lang/common/helpers.gleam
import caffeine_lang/common/accepted_types
import caffeine_lang/common/errors.{type CompilationError}
import gleam/dynamic.{type Dynamic}
import gleam/dynamic/decode
import gleam/list
import gleam/result
import simplifile
/// A tuple of a label, type, and value used for template resolution.
pub type ValueTuple {
ValueTuple(label: String, typ: accepted_types.AcceptedTypes, value: Dynamic)
}
/// Reads the contents of a JSON file as a string.
@internal
pub fn json_from_file(file_path) -> Result(String, CompilationError) {
case simplifile.read(file_path) {
Ok(file_contents) -> Ok(file_contents)
Error(err) ->
Error(errors.ParserFileReadError(
msg: simplifile.describe_error(err) <> " (" <> file_path <> ")",
))
}
}
/// Maps each referrer to its corresponding reference by matching names.
/// Returns a list of tuples pairing each referrer with its matched reference.
@internal
pub fn map_reference_to_referrer_over_collection(
references references: List(a),
referrers referrers: List(b),
reference_name reference_name: fn(a) -> String,
referrer_reference referrer_reference: fn(b) -> String,
) {
referrers
|> list.map(fn(referrer) {
// Already performed this check so can assert it.
let assert Ok(reference) =
references
|> list.filter(fn(reference) {
{ reference |> reference_name } == { referrer |> referrer_reference }
})
|> list.first
#(referrer, reference)
})
}
/// Extract a value from a list of ValueTuple by label using the provided decoder.
pub fn extract_value(
values: List(ValueTuple),
label: String,
decoder: decode.Decoder(a),
) -> Result(a, Nil) {
values
|> list.find(fn(vt) { vt.label == label })
|> result.try(fn(vt) {
decode.run(vt.value, decoder) |> result.replace_error(Nil)
})
}