Packages
caffeine_lang
4.8.3
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/value.gleam
import gleam/dict.{type Dict}
import gleam/float
import gleam/int
import gleam/list
import gleam/result
import gleam/string
/// A typed value ADT that carries type information forward through the pipeline.
/// Replaces the use of Dynamic for values in the compiler pipeline.
pub type Value {
StringValue(String)
IntValue(Int)
FloatValue(Float)
PercentageValue(Float)
BoolValue(Bool)
ListValue(List(Value))
DictValue(Dict(String, Value))
/// Represents an absent Optional or Defaulted value.
NilValue
}
/// Converts a Value to its string representation for template resolution.
@internal
pub fn to_string(value: Value) -> String {
case value {
StringValue(s) -> s
IntValue(i) -> int.to_string(i)
FloatValue(f) -> float.to_string(f)
PercentageValue(f) -> float.to_string(f)
BoolValue(True) -> "true"
BoolValue(False) -> "false"
ListValue(items) ->
"[" <> items |> list.map(to_string) |> string.join(", ") <> "]"
DictValue(d) ->
"{"
<> d
|> dict.to_list
|> list.map(fn(pair) { pair.0 <> ": " <> to_string(pair.1) })
|> string.join(", ")
<> "}"
NilValue -> ""
}
}
/// Converts a Value to a short preview string for error messages.
@internal
pub fn to_preview_string(value: Value) -> String {
case value {
StringValue(s) -> "\"" <> s <> "\""
IntValue(i) -> int.to_string(i)
FloatValue(f) -> float.to_string(f)
PercentageValue(f) -> float.to_string(f) <> "%"
BoolValue(True) -> "true"
BoolValue(False) -> "false"
ListValue(_) -> "List"
DictValue(_) -> "Dict"
NilValue -> "Nil"
}
}
/// Returns a type name string for a Value, useful for error messages.
@internal
pub fn classify(value: Value) -> String {
case value {
StringValue(_) -> "String"
IntValue(_) -> "Int"
FloatValue(_) -> "Float"
PercentageValue(_) -> "Percentage"
BoolValue(_) -> "Bool"
ListValue(_) -> "List"
DictValue(_) -> "Dict"
NilValue -> "Nil"
}
}
/// Extracts a String from a Value, returning Error if not a StringValue.
@internal
pub fn extract_string(value: Value) -> Result(String, Nil) {
case value {
StringValue(s) -> Ok(s)
_ -> Error(Nil)
}
}
/// Extracts an Int from a Value, returning Error if not an IntValue.
@internal
pub fn extract_int(value: Value) -> Result(Int, Nil) {
case value {
IntValue(i) -> Ok(i)
_ -> Error(Nil)
}
}
/// Extracts a Float from a Value, returning Error if not a FloatValue.
@internal
pub fn extract_float(value: Value) -> Result(Float, Nil) {
case value {
FloatValue(f) -> Ok(f)
_ -> Error(Nil)
}
}
/// Extracts a Float from a PercentageValue, returning Error otherwise.
@internal
pub fn extract_percentage(value: Value) -> Result(Float, Nil) {
case value {
PercentageValue(f) -> Ok(f)
_ -> Error(Nil)
}
}
/// Extracts a Bool from a Value, returning Error if not a BoolValue.
@internal
pub fn extract_bool(value: Value) -> Result(Bool, Nil) {
case value {
BoolValue(b) -> Ok(b)
_ -> Error(Nil)
}
}
/// Extracts a List from a Value, returning Error if not a ListValue.
@internal
pub fn extract_list(value: Value) -> Result(List(Value), Nil) {
case value {
ListValue(l) -> Ok(l)
_ -> Error(Nil)
}
}
/// Extracts a Dict from a Value, returning Error if not a DictValue.
@internal
pub fn extract_dict(value: Value) -> Result(Dict(String, Value), Nil) {
case value {
DictValue(d) -> Ok(d)
_ -> Error(Nil)
}
}
/// Extracts a Dict(String, String) from a Value.
/// Returns Error if not a DictValue or if any value is not a StringValue.
@internal
pub fn extract_string_dict(value: Value) -> Result(Dict(String, String), Nil) {
case value {
DictValue(d) ->
d
|> dict.to_list
|> list.try_map(fn(pair) {
case pair.1 {
StringValue(s) -> Ok(#(pair.0, s))
_ -> Error(Nil)
}
})
|> result.map(dict.from_list)
_ -> Error(Nil)
}
}
/// Checks if a Value is NilValue.
@internal
pub fn is_nil(value: Value) -> Bool {
case value {
NilValue -> True
_ -> False
}
}