gleamgen/expression
Generating Expressions:
Literals:
intfloatstringboolnillist- tuple literals (
tuple1,tuple2,tuple3,tuple4,tuple5,tuple6,tuple7,tuple8,tuple9)
Operators:
Keywords:
Other expressions:
okerroroption_someoption_nonefunction.anonymous- constructors (
construct0,construct1,construct2,construct3,construct4,construct5,construct6,construct7,construct8,construct9) - call expressions (
call0,call1,call2,call3,call4,call5,call6,call7,call8,call9) - import from other files (
import_.value_of_type,import_.raw_ident)
Creating dynamic expressions:
Using expressions:
Types
pub type Comparison {
GreaterThan
GreaterThanOrEqual
LessThan
LessThanOrEqual
}
Constructors
-
GreaterThan -
GreaterThanOrEqual -
LessThan -
LessThanOrEqual
pub opaque type Expression(type_)
See math_operator and math_operator_flaot`
pub type MathOperator {
Add
Sub
Mul
Div
}
Constructors
-
Add -
Sub -
Mul -
Div
Values
pub fn and(
expr1: Expression(Bool),
expr2: Expression(Bool),
) -> Expression(Bool)
Apply the and operator to two expressions with the type of Bool.
expression.and(expression.raw("has_cheese"), expression.raw("wants_cheese"))
// Expression(Bool) -> "has_cheese && wants_cheese"
pub fn assert_(
condition: Expression(Bool),
as_string: option.Option(String),
) -> Expression(Nil)
Create an assert expression with an optional as clause.
pub fn bool(value: Bool) -> Expression(Bool)
Create a boolean literal expression.
expression.bool(True) // Expression(Bool) -> True
pub fn call0(func: Expression(fn() -> ret)) -> Expression(ret)
Call a function or constructor with no arguments
expression.call0(
import_.value_of_type(dict_module, "new", types.reference(dict.new))
) // Expression(dict.Dict(key, value)) -> "dict.new()"
pub fn call1(
func: Expression(fn(arg1) -> ret),
arg1: Expression(arg1),
) -> Expression(ret)
Call a function or constructor with one argument.
expression.call1(
import_.value_of_type(list_module, "is_empty", types.reference(list.is_empty))
expression.list([])
) // Expression(Bool) -> "list.is_empty([])"
To call with a dynamic number of arguments, use call_dynamic.
pub fn call2(
func: Expression(fn(arg1, arg2) -> ret),
arg1: Expression(arg1),
arg2: Expression(arg2),
) -> Expression(ret)
Call a function or constructor with two arguments.
See call1.
pub fn call3(
func: Expression(fn(arg1, arg2, arg3) -> ret),
arg1: Expression(arg1),
arg2: Expression(arg2),
arg3: Expression(arg3),
) -> Expression(ret)
Call a function or constructor with three arguments.
See call1.
pub fn call4(
func: Expression(fn(arg1, arg2, arg3, arg4) -> ret),
arg1: Expression(arg1),
arg2: Expression(arg2),
arg3: Expression(arg3),
arg4: Expression(arg4),
) -> Expression(ret)
Call a function or constructor with four arguments.
See call1.
pub fn call5(
func: Expression(fn(arg1, arg2, arg3, arg4, arg5) -> ret),
arg1: Expression(arg1),
arg2: Expression(arg2),
arg3: Expression(arg3),
arg4: Expression(arg4),
arg5: Expression(arg5),
) -> Expression(ret)
Call a function or constructor with five arguments.
See call1.
pub fn call6(
func: Expression(fn(arg1, arg2, arg3, arg4, arg5, arg6) -> ret),
arg1: Expression(arg1),
arg2: Expression(arg2),
arg3: Expression(arg3),
arg4: Expression(arg4),
arg5: Expression(arg5),
arg6: Expression(arg6),
) -> Expression(ret)
Call a function or constructor with six arguments.
See call1.
pub fn call7(
func: Expression(
fn(arg1, arg2, arg3, arg4, arg5, arg6, arg7) -> ret,
),
arg1: Expression(arg1),
arg2: Expression(arg2),
arg3: Expression(arg3),
arg4: Expression(arg4),
arg5: Expression(arg5),
arg6: Expression(arg6),
arg7: Expression(arg7),
) -> Expression(ret)
Call a function or constructor with seven arguments.
See call1.
pub fn call8(
func: Expression(
fn(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) -> ret,
),
arg1: Expression(arg1),
arg2: Expression(arg2),
arg3: Expression(arg3),
arg4: Expression(arg4),
arg5: Expression(arg5),
arg6: Expression(arg6),
arg7: Expression(arg7),
arg8: Expression(arg8),
) -> Expression(ret)
Call a function or constructor with eight arguments.
See call1.
pub fn call9(
func: Expression(
fn(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) -> ret,
),
arg1: Expression(arg1),
arg2: Expression(arg2),
arg3: Expression(arg3),
arg4: Expression(arg4),
arg5: Expression(arg5),
arg6: Expression(arg6),
arg7: Expression(arg7),
arg8: Expression(arg8),
arg9: Expression(arg9),
) -> Expression(ret)
Call a function or constructor with nine arguments.
See call1.
pub fn call_dynamic(
func: Expression(type_.Dynamic),
args: List(Expression(type_.Dynamic)),
) -> Expression(type_.Dynamic)
Call a function or constructor without type checking
pub fn coerce_dynamic_unsafe(
type_: Expression(t1),
) -> Expression(t2)
Convert an expression to any type without checking
pub fn comparison(
expr1: Expression(Int),
operator: Comparison,
expr2: Expression(Int),
) -> Expression(Bool)
pub fn comparison_float(
expr1: Expression(Float),
operator: Comparison,
expr2: Expression(Float),
) -> Expression(Bool)
pub fn concat_string(
expr1: Expression(String),
expr2: Expression(String),
) -> Expression(String)
Use the <> operator to concatenate two strings.
expression.concat_string(expression.raw("greeting"), expression.string("world"))
// Expression(String) -> greeting <> "world"
pub fn construct0(
constructor: Expression(fn() -> ret),
) -> Expression(ret)
pub const construct1: fn(
Expression(fn(arg1) -> ret),
Expression(arg1),
) -> Expression(ret)
pub const construct2: fn(
Expression(fn(arg1, arg2) -> ret),
Expression(arg1),
Expression(arg2),
) -> Expression(ret)
pub const construct3: fn(
Expression(fn(arg1, arg2, arg3) -> ret),
Expression(arg1),
Expression(arg2),
Expression(arg3),
) -> Expression(ret)
pub const construct4: fn(
Expression(fn(arg1, arg2, arg3, arg4) -> ret),
Expression(arg1),
Expression(arg2),
Expression(arg3),
Expression(arg4),
) -> Expression(ret)
pub const construct5: fn(
Expression(fn(arg1, arg2, arg3, arg4, arg5) -> ret),
Expression(arg1),
Expression(arg2),
Expression(arg3),
Expression(arg4),
Expression(arg5),
) -> Expression(ret)
pub const construct6: fn(
Expression(fn(arg1, arg2, arg3, arg4, arg5, arg6) -> ret),
Expression(arg1),
Expression(arg2),
Expression(arg3),
Expression(arg4),
Expression(arg5),
Expression(arg6),
) -> Expression(ret)
pub const construct7: fn(
Expression(fn(arg1, arg2, arg3, arg4, arg5, arg6, arg7) -> ret),
Expression(arg1),
Expression(arg2),
Expression(arg3),
Expression(arg4),
Expression(arg5),
Expression(arg6),
Expression(arg7),
) -> Expression(ret)
pub const construct8: fn(
Expression(
fn(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) -> ret,
),
Expression(arg1),
Expression(arg2),
Expression(arg3),
Expression(arg4),
Expression(arg5),
Expression(arg6),
Expression(arg7),
Expression(arg8),
) -> Expression(ret)
pub const construct9: fn(
Expression(
fn(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9) -> ret,
),
Expression(arg1),
Expression(arg2),
Expression(arg3),
Expression(arg4),
Expression(arg5),
Expression(arg6),
Expression(arg7),
Expression(arg8),
Expression(arg9),
) -> Expression(ret)
pub fn echo_(
expression: Expression(a),
as_string: option.Option(String),
) -> Expression(a)
Create an echo expression with an optional as clause.
expression.echo_(
expression.math_operator(
expression.int(2),
expression.Add,
expression.int(3),
),
option.None
) // Expression(Int) -> echo 2 + 3
pub fn equals(
first: Expression(a),
second: Expression(a),
) -> Expression(Bool)
Determine if values are equal using == syntax.
expression.equals(
expression.raw("movie"),
expression.string("The Needle")
) // Expression(Bool) -> movie == "The Needle"
See also: not_equals.
pub fn error(
err_value: Expression(err),
) -> Expression(Result(ok, err))
Create an Error value of the result type.
expression.error(expression.string("File not found"))
// Expression(Result(ok, String)) -> Error("File not found")
pub fn field(
base: Expression(a),
field: String,
) -> Expression(type_.Dynamic)
Access a field of a custom type or tuple.
This function cannot be type checked, so it returns an Expression(type_.Dynamic)
expression.field(expression.raw("movie"), "director")
// Expression(type_.Dynamic) -> movie.director
pub fn float(value: Float) -> Expression(Float)
Create a float literal expression.
expression.float(3.14) // Expression(Float) -> 3.14
pub fn int(value: Int) -> Expression(Int)
Create an integer literal expression.
expression.int(42) // Expression(Int) -> 42
pub fn list(value: List(Expression(t))) -> Expression(List(t))
Create a list literal expression.
expression.list([
expression.int(1),
expression.int(2),
expression.int(3),
expression.int(4),
]) // Expression(List(Int)) -> [1, 2, 3, 4]
See also list_prepend.
pub fn list_prepend(
prepending: List(Expression(t)),
original: Expression(List(t)),
) -> Expression(List(t))
Prepend value(s) to list using [value, ..original] syntax.
expression.list_prepend(
[expression.int(1), expression.int(2)],
expression.raw("integers")
) Expression(List(Int)) // -> [1, 2, ..integers]
pub fn math_operator(
expr1: Expression(Int),
op: MathOperator,
expr2: Expression(Int),
) -> Expression(Int)
Apply a math operator to two expressions with the type of Int
expression.math_operator(expression.int(3), expression.Add, expression.int(5))
|> expression.render(render.default_context())
|> render.to_string()
// -> "3 + 5"
pub fn math_operator_float(
expr1: Expression(Float),
op: MathOperator,
expr2: Expression(Float),
) -> Expression(Int)
Apply a math operator to two expressions with the type of Float
expression.math_operator_float(
expression.float(3.3),
expression.Sub,
expression.unchecked_ident("other_float")
)
|> expression.render(render.default_context())
|> render.to_string()
// -> "3.3 -. other_float"
pub fn nil() -> Expression(Nil)
Create a Nil literal expression.
expression.nil() // Expression(Nil) -> Nil
pub fn not_equals(
first: Expression(a),
second: Expression(a),
) -> Expression(Bool)
Determine if values are not equal using != syntax.
expression.not_equals(
expression.raw("movie"),
expression.string("The Shining")
) // Expression(Bool) -> movie != "The Shining"
See also: equals.
pub fn ok(
ok_value: Expression(ok),
) -> Expression(Result(ok, err))
Create an Ok value of the result type.
expression.ok(expression.int(5))
// Expression(Result(Int, error)) -> Ok(5)
pub fn option_none() -> Expression(option.Option(t))
pub fn option_some(
value: Expression(t),
) -> Expression(option.Option(t))
pub fn or(
expr1: Expression(Bool),
expr2: Expression(Bool),
) -> Expression(Bool)
Apply the or operator to two expressions with the type of Bool.
expression.or(expression.raw("wants_cake"), expression.raw("wants_cheese"))
// Expression(Bool) -> "wants_cake || wants_cheese"
pub fn panic_(as_string: option.Option(String)) -> Expression(a)
Create a panic expression with an optional as clause.
expression.panic_(option.Some("ahhhhhh!!!"))
// Expression(a) -> "panic as \"ahhhhhh!!!\""
pub fn raw(value: String) -> Expression(a)
Provide an ident that could be of any type
Prefer using raw_of_type
pub fn raw_of_type(
value: String,
type_: type_.GeneratedType(t),
) -> Expression(t)
Provide a string to inject without any checking of the specified type
pub fn render(
expression: Expression(t),
context: render.Context,
) -> render.Rendered
Render an expression. See the render module for more information.
In general, prefer rendering at the module level, rather than individual expressions.
pub fn string(value: String) -> Expression(String)
Create a string literal expression.
expression.string("Labas!") // Expression(String) -> "Labas!"
pub fn to_dynamic(
type_: Expression(t),
) -> Expression(type_.Dynamic)
pub fn todo_(as_string: option.Option(String)) -> Expression(a)
Create a todo expression with an optional as clause.
expression.todo_(option.Some("some unimplemented thing"))
// Expression(a) -> "todo as \"some unimplemented thing\""
pub fn tuple1(arg1: Expression(a)) -> Expression(#(a))
pub fn tuple2(
arg1: Expression(a),
arg2: Expression(b),
) -> Expression(#(a, b))
pub fn tuple3(
arg1: Expression(a),
arg2: Expression(b),
arg3: Expression(c),
) -> Expression(#(a, b, c))
pub fn tuple4(
arg1: Expression(a),
arg2: Expression(b),
arg3: Expression(c),
arg4: Expression(d),
) -> Expression(#(a, b, c, d))
pub fn tuple5(
arg1: Expression(a),
arg2: Expression(b),
arg3: Expression(c),
arg4: Expression(d),
arg5: Expression(e),
) -> Expression(#(a, b, c, d, e))
pub fn tuple6(
arg1: Expression(a),
arg2: Expression(b),
arg3: Expression(c),
arg4: Expression(d),
arg5: Expression(e),
arg6: Expression(f),
) -> Expression(#(a, b, c, d, e, f))
pub fn tuple7(
arg1: Expression(a),
arg2: Expression(b),
arg3: Expression(c),
arg4: Expression(d),
arg5: Expression(e),
arg6: Expression(f),
arg7: Expression(g),
) -> Expression(#(a, b, c, d, e, f, g))
pub fn tuple8(
arg1: Expression(a),
arg2: Expression(b),
arg3: Expression(c),
arg4: Expression(d),
arg5: Expression(e),
arg6: Expression(f),
arg7: Expression(g),
arg8: Expression(h),
) -> Expression(#(a, b, c, d, e, f, g, h))
pub fn tuple9(
arg1: Expression(a),
arg2: Expression(b),
arg3: Expression(c),
arg4: Expression(d),
arg5: Expression(e),
arg6: Expression(f),
arg7: Expression(g),
arg8: Expression(h),
arg9: Expression(i),
) -> Expression(#(a, b, c, d, e, f, g, h, i))
pub fn type_(expr: Expression(t)) -> type_.GeneratedType(t)
Get the internal type of an expression
pub fn with_render_config(
expression: Expression(t),
config: config.Config,
) -> Expression(t)
Return a new expression that will be rendered with a specific render config,
separate from the config used for the surrounding expression.
See the render module for more information.