hcl::eval

Struct FuncDef

Source
pub struct FuncDef { /* private fields */ }
Expand description

The definition of a function that can be called in HCL expressions.

It defines the function to call, and number and types of parameters that the function accepts. The parameter information is used to validate function arguments prior to calling it.

The signature of a function is defined by the Func type alias. For available parameter types see the documentation of ParamType.

§Function call evaluation

When a FuncCall is evaluated (via its evaluate method), the arguments are validated against the defined function parameters before calling the function. The evaluation will stop with an error if too few or too many arguments are provided, of if their types do not match the expected parameter types.

Because all arguments are validated before calling the function, unnecessary length and type checks on the function arguments can be avoided in the function body.

§Examples

use hcl::eval::{Context, FuncArgs, FuncDef, ParamType};
use hcl::Value;

fn add(args: FuncArgs) -> Result<Value, String> {
    let a = args[0].as_number().unwrap();
    let b = args[1].as_number().unwrap();
    Ok(Value::Number(*a + *b))
}

let params = [ParamType::Number, ParamType::Number];

let func_def = FuncDef::new(add, params);

let mut ctx = Context::new();

// Declare the function in the context to make it available
// during expression evaluation.
ctx.declare_func("add", func_def);

// Use the context to evaluate an expression.
// ...

Alternatively, the FuncDefBuilder can be used to construct the FuncDef:

let func_def = FuncDef::builder()
    .param(ParamType::Number)
    .param(ParamType::Number)
    .build(add);

See the documentation of the FuncDefBuilder for all available methods.

Implementations§

Source§

impl FuncDef

Source

pub fn new<P>(func: Func, params: P) -> FuncDef
where P: IntoIterator<Item = ParamType>,

Creates a new FuncDef from a function and its parameters.

Note: if you want to define a FuncDef with a variadic parameter, use the .builder() method. It provides a FuncDefBuilder which also lets you define variadic parameters.

See the type-level documentation of FuncDef for usage examples.

Source

pub fn builder() -> FuncDefBuilder

Creates a FuncDefBuilder.

See the type-level documentation of FuncDef for usage examples.

Trait Implementations§

Source§

impl Clone for FuncDef

Source§

fn clone(&self) -> FuncDef

Returns a copy of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for FuncDef

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dst: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.