Packages
caffeine_lang
1.0.1
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/errors.{type CompilationError, ParserFileReadError}
import gleam/dynamic.{type Dynamic}
import gleam/list
import simplifile
/// AcceptedTypes is a union of all the types that can be used as filters. It is recursive
/// to allow for nested filters. This may be a bug in the future since it seems it may
/// infinitely recurse.
pub type AcceptedTypes {
Boolean
Float
Integer
String
Dict(AcceptedTypes, AcceptedTypes)
List(AcceptedTypes)
Optional(AcceptedTypes)
/// Defaulted type stores the inner type and its default value as a string
/// e.g., Defaulted(Integer, "10") means an optional integer with default 10
Defaulted(AcceptedTypes, String)
}
/// A tuple of a label, type, and value used for template resolution.
pub type ValueTuple {
ValueTuple(label: String, typ: AcceptedTypes, value: Dynamic)
}
/// Converts an AcceptedTypes to its string representation.
pub fn accepted_type_to_string(accepted_type: AcceptedTypes) -> String {
case accepted_type {
Boolean -> "Boolean"
Float -> "Float"
Integer -> "Integer"
String -> "String"
Dict(key_type, value_type) ->
"Dict("
<> accepted_type_to_string(key_type)
<> ", "
<> accepted_type_to_string(value_type)
<> ")"
List(inner_type) -> "List(" <> accepted_type_to_string(inner_type) <> ")"
Optional(inner_type) ->
"Optional(" <> accepted_type_to_string(inner_type) <> ")"
Defaulted(inner_type, default_val) ->
"Defaulted("
<> accepted_type_to_string(inner_type)
<> ", "
<> default_val
<> ")"
}
}
/// Reads the contents of a JSON file as a string.
pub fn json_from_file(file_path) -> Result(String, CompilationError) {
case simplifile.read(file_path) {
Ok(file_contents) -> Ok(file_contents)
Error(err) ->
Error(ParserFileReadError(
msg: simplifile.describe_error(err) <> " (" <> file_path <> ")",
))
}
}
/// A helper for chaining Result operations with the `use` syntax.
/// Equivalent to `result.try` but defined here for convenient use with `use`.
pub fn result_try(
result: Result(a, e),
next: fn(a) -> Result(b, e),
) -> Result(b, e) {
case result {
Ok(value) -> next(value)
Error(err) -> Error(err)
}
}
/// Maps each referrer to its corresponding reference by matching names.
/// Returns a list of tuples pairing each referrer with its matched reference.
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)
})
}