pub use lava_core::{
Architecture, BackendRef, MagmaPlan, Multiplicity, ProviderRef, RenderError, RenderTarget,
Resource, ResourceRef, Stack, Synthesizer, TerraformJson, Value,
};
pub use lava_arch::{ArchError, ArchitectureSpec, Builder, Library};
pub use lava_contracts::{
ArchitectureResult, ClusterResult, DnsRecord, DnsResult, IamResult, LoadBalancerResult,
NetworkResult, ObservabilityResult, SecretBackendKind, SecretRef, SecretsResult,
StorageResult,
};
pub use lava_stack::{Stack as StackInstance, StackConfig, StackError, StackTag};
pub use lava_types::{MatchKind, Type, TypeError};
pub use lava_schema::{Field, Interface, InterfaceRegistry, SchemaError};
pub use lava_eval::{
eval_architecture, eval_architecture_with_schema, parse, parse_all, Atom, EvalError,
InputBindings, ParseError, Sx,
};
pub use lava_architectures::{interface_for, load_bundled, ARCHITECTURE_DIR};
pub use lava_runtime::{
pick_runtime_for_path, ArtifactBinding, ArtifactInput, Diagnostic, DiagnosticLevel,
EmbeddedRuntime, EvaluationResult, LavaRuntime, RuntimeError, TerraformJsonRuntime,
};
#[cfg(test)]
mod tests {
use super::*;
use indexmap::IndexMap;
#[test]
fn one_import_full_pipeline_works_end_to_end() {
let tlisp = r#"
(deflava-architecture demo-vpc
:inputs ((:cidr "10.50.0.0/16"))
:resources (
(aws-vpc "demo"
:cidr-block "{cidr}"
:enable-dns-support #t)))
"#;
let rt = LavaRuntime::new();
let input = ArtifactInput {
source: tlisp.to_string(),
bindings: IndexMap::new(),
name: Some("demo".to_string()),
};
let result = rt.evaluate(&input).unwrap();
let json: serde_json::Value =
Synthesizer::<TerraformJson>::synthesize(&result.architecture).unwrap();
assert_eq!(json["resource"]["aws_vpc"]["demo"]["cidr_block"], "10.50.0.0/16");
assert_eq!(json["resource"]["aws_vpc"]["demo"]["enable_dns_support"], true);
}
#[test]
fn typed_interface_validation_via_prelude() {
let mut iface = Interface::new("aws-vpc-network");
iface.inputs.insert(
"cidr".to_string(),
Field::strict(Type::CidrBlock).with_doc("VPC CIDR block"),
);
iface.inputs.insert(
"env".to_string(),
Field::strict(Type::Enum {
values: vec!["prod".into(), "staging".into(), "dev".into()],
}),
);
let mut bag = IndexMap::new();
bag.insert("cidr".to_string(), "10.0.0.0/16".to_string());
bag.insert("env".to_string(), "prod".to_string());
assert!(iface.validate_inputs(&bag).is_ok());
bag.insert("env".to_string(), "preview".to_string());
let errs = iface.validate_inputs(&bag).unwrap_err();
assert!(matches!(errs[0], SchemaError::TypeMismatch { .. }));
}
#[test]
fn synthesizer_multi_target_reachable_via_prelude() {
let arch = Architecture::new("empty");
let _tf: serde_json::Value =
Synthesizer::<TerraformJson>::synthesize(&arch).unwrap();
let _plan: serde_json::Value = Synthesizer::<MagmaPlan>::synthesize(&arch).unwrap();
}
#[test]
fn auto_detect_runtime_via_prelude() {
let p = std::path::Path::new("/some/path/architecture.tlisp");
let rt = pick_runtime_for_path(p).unwrap();
assert_eq!(rt.kind(), "lava");
}
}