use std::error::Error;
use std::sync::Arc;
use indexmap::IndexMap;
use crate::context::IExpressionContext;
use crate::exceptions::TemplateProcessingException;
use crate::expression::TemplateValue;
use crate::util::Utf16String;
pub type LinkBuilderResult<T> = Result<T, Box<dyn Error + Send + Sync>>;
pub trait ILinkBuilder: Send + Sync {
fn get_name(&self) -> Option<&Utf16String>;
fn get_order(&self) -> Option<i32>;
fn build_link(
&self,
context: &dyn IExpressionContext,
base: Option<&Utf16String>,
parameters: Option<&IndexMap<Option<Utf16String>, Option<Arc<TemplateValue>>>>,
) -> Result<Option<Utf16String>, TemplateProcessingException>;
fn build_link_nullable(
&self,
context: Option<&dyn IExpressionContext>,
base: Option<&Utf16String>,
parameters: Option<&IndexMap<Option<Utf16String>, Option<Arc<TemplateValue>>>>,
) -> LinkBuilderResult<Option<Utf16String>> {
crate::util::Validate::not_null(context, Some("Expression context cannot be null"))
.map_err(|error| Box::new(error) as Box<dyn Error + Send + Sync>)?;
self.build_link(
context.expect("context was validated as non-null"),
base,
parameters,
)
.map_err(|error| Box::new(error) as Box<dyn Error + Send + Sync>)
}
}