use super::models;
use std::collections::HashMap;
pub fn name(id: &str) -> models::Name {
models::Name {
id: id.to_string(),
path: vec![],
}
}
pub fn qualified_name(id: &str, path: &[&str]) -> models::Name {
models::Name {
id: id.to_string(),
path: path.iter().map(|s| (*s).to_string()).collect(),
}
}
pub fn entity_uid(ty: models::Name, eid: &str) -> models::EntityUid {
models::EntityUid {
ty: Some(ty),
eid: eid.to_string(),
}
}
pub fn bool_type() -> models::Type {
models::Type {
data: Some(models::r#type::Data::Prim(
models::r#type::Prim::Bool.into(),
)),
}
}
pub fn long_type() -> models::Type {
models::Type {
data: Some(models::r#type::Data::Prim(
models::r#type::Prim::Long.into(),
)),
}
}
pub fn string_type() -> models::Type {
models::Type {
data: Some(models::r#type::Data::Prim(
models::r#type::Prim::String.into(),
)),
}
}
pub fn set_type(element: models::Type) -> models::Type {
models::Type {
data: Some(models::r#type::Data::SetElem(Box::new(element))),
}
}
pub fn entity_type(ty: &str) -> models::Type {
models::Type {
data: Some(models::r#type::Data::Entity(name(ty))),
}
}
pub fn extension_type(ext_name: &str) -> models::Type {
models::Type {
data: Some(models::r#type::Data::Ext(name(ext_name))),
}
}
pub fn record_type(
attrs: impl IntoIterator<Item = (&'static str, models::AttributeType)>,
) -> models::Type {
models::Type {
data: Some(models::r#type::Data::Record(models::r#type::Record {
attrs: attrs.into_iter().map(|(k, v)| (k.to_string(), v)).collect(),
})),
}
}
pub fn required(ty: models::Type) -> models::AttributeType {
models::AttributeType {
attr_type: Some(ty),
is_required: true,
}
}
pub fn optional(ty: models::Type) -> models::AttributeType {
models::AttributeType {
attr_type: Some(ty),
is_required: false,
}
}
pub fn lit_bool(b: bool) -> models::Expr {
models::Expr {
expr_kind: Some(models::expr::ExprKind::Lit(models::expr::Literal {
lit: Some(models::expr::literal::Lit::B(b)),
})),
}
}
pub fn lit_long(i: i64) -> models::Expr {
models::Expr {
expr_kind: Some(models::expr::ExprKind::Lit(models::expr::Literal {
lit: Some(models::expr::literal::Lit::I(i)),
})),
}
}
pub fn lit_str(s: &str) -> models::Expr {
models::Expr {
expr_kind: Some(models::expr::ExprKind::Lit(models::expr::Literal {
lit: Some(models::expr::literal::Lit::S(s.to_string())),
})),
}
}
pub fn lit_euid(ty: &str, eid: &str) -> models::Expr {
models::Expr {
expr_kind: Some(models::expr::ExprKind::Lit(models::expr::Literal {
lit: Some(models::expr::literal::Lit::Euid(entity_uid(name(ty), eid))),
})),
}
}
pub fn var(v: models::expr::Var) -> models::Expr {
models::Expr {
expr_kind: Some(models::expr::ExprKind::Var(v.into())),
}
}
pub fn not(expr: models::Expr) -> models::Expr {
models::Expr {
expr_kind: Some(models::expr::ExprKind::UApp(Box::new(
models::expr::UnaryApp {
op: models::expr::unary_app::Op::Not.into(),
expr: Some(Box::new(expr)),
},
))),
}
}
pub fn binary(
op: models::expr::binary_app::Op,
left: models::Expr,
right: models::Expr,
) -> models::Expr {
models::Expr {
expr_kind: Some(models::expr::ExprKind::BApp(Box::new(
models::expr::BinaryApp {
op: op.into(),
left: Some(Box::new(left)),
right: Some(Box::new(right)),
},
))),
}
}
pub fn if_then_else(test: models::Expr, then: models::Expr, els: models::Expr) -> models::Expr {
models::Expr {
expr_kind: Some(models::expr::ExprKind::If(Box::new(models::expr::If {
test_expr: Some(Box::new(test)),
then_expr: Some(Box::new(then)),
else_expr: Some(Box::new(els)),
}))),
}
}
pub fn get_attr(expr: models::Expr, attr: &str) -> models::Expr {
models::Expr {
expr_kind: Some(models::expr::ExprKind::GetAttr(Box::new(
models::expr::GetAttr {
expr: Some(Box::new(expr)),
attr: attr.to_string(),
},
))),
}
}
pub fn has_attr(expr: models::Expr, attr: &str) -> models::Expr {
models::Expr {
expr_kind: Some(models::expr::ExprKind::HasAttr(Box::new(
models::expr::HasAttr {
expr: Some(Box::new(expr)),
attr: attr.to_string(),
},
))),
}
}
pub fn set(elems: impl IntoIterator<Item = models::Expr>) -> models::Expr {
models::Expr {
expr_kind: Some(models::expr::ExprKind::Set(models::expr::Set {
elements: elems.into_iter().collect(),
})),
}
}
pub fn record(items: impl IntoIterator<Item = (&'static str, models::Expr)>) -> models::Expr {
models::Expr {
expr_kind: Some(models::expr::ExprKind::Record(models::expr::Record {
items: items.into_iter().map(|(k, v)| (k.to_string(), v)).collect(),
})),
}
}
pub fn ext_call(fn_name: &str, args: impl IntoIterator<Item = models::Expr>) -> models::Expr {
models::Expr {
expr_kind: Some(models::expr::ExprKind::ExtApp(
models::expr::ExtensionFunctionApp {
fn_name: Some(name(fn_name)),
args: args.into_iter().collect(),
},
)),
}
}
pub fn entity(
ty: &str,
eid: &str,
attrs: impl IntoIterator<Item = (&'static str, models::Expr)>,
) -> models::Entity {
models::Entity {
uid: Some(entity_uid(name(ty), eid)),
attrs: attrs.into_iter().map(|(k, v)| (k.to_string(), v)).collect(),
ancestors: vec![],
tags: HashMap::new(),
}
}
pub fn entity_full(
ty: &str,
eid: &str,
attrs: impl IntoIterator<Item = (&'static str, models::Expr)>,
ancestors: impl IntoIterator<Item = models::EntityUid>,
tags: impl IntoIterator<Item = (&'static str, models::Expr)>,
) -> models::Entity {
models::Entity {
uid: Some(entity_uid(name(ty), eid)),
attrs: attrs.into_iter().map(|(k, v)| (k.to_string(), v)).collect(),
ancestors: ancestors.into_iter().collect(),
tags: tags.into_iter().map(|(k, v)| (k.to_string(), v)).collect(),
}
}
pub fn entity_decl(
ty: &str,
attrs: impl IntoIterator<Item = (&'static str, models::AttributeType)>,
) -> models::EntityDecl {
models::EntityDecl {
name: Some(name(ty)),
descendants: vec![],
attributes: attrs.into_iter().map(|(k, v)| (k.to_string(), v)).collect(),
tags: None,
enum_choices: vec![],
}
}
pub fn entity_decl_full(
ty: &str,
descendants: impl IntoIterator<Item = &'static str>,
attrs: impl IntoIterator<Item = (&'static str, models::AttributeType)>,
tags: Option<models::Type>,
) -> models::EntityDecl {
models::EntityDecl {
name: Some(name(ty)),
descendants: descendants.into_iter().map(name).collect(),
attributes: attrs.into_iter().map(|(k, v)| (k.to_string(), v)).collect(),
tags,
enum_choices: vec![],
}
}
pub fn schema(entity_decls: impl IntoIterator<Item = models::EntityDecl>) -> models::Schema {
models::Schema {
entity_decls: entity_decls.into_iter().collect(),
action_decls: vec![],
}
}
pub fn schema_full(
entity_decls: impl IntoIterator<Item = models::EntityDecl>,
action_decls: impl IntoIterator<Item = models::ActionDecl>,
) -> models::Schema {
models::Schema {
entity_decls: entity_decls.into_iter().collect(),
action_decls: action_decls.into_iter().collect(),
}
}
pub fn action_decl(
action_entity: (&str, &str),
principal_types: impl IntoIterator<Item = &'static str>,
resource_types: impl IntoIterator<Item = &'static str>,
context: impl IntoIterator<Item = (&'static str, models::AttributeType)>,
) -> models::ActionDecl {
models::ActionDecl {
name: Some(entity_uid(name(action_entity.0), action_entity.1)),
descendants: vec![],
principal_types: principal_types.into_iter().map(name).collect(),
resource_types: resource_types.into_iter().map(name).collect(),
context: context
.into_iter()
.map(|(k, v)| (k.to_string(), v))
.collect(),
}
}