summaryrefslogtreecommitdiff
path: root/src/codegen.rs
diff options
context:
space:
mode:
authorDaniel Silverstone <dsilvers@digital-scurf.org>2021-10-19 19:30:37 +0100
committerDaniel Silverstone <dsilvers@digital-scurf.org>2021-11-19 20:18:50 +0000
commit5a92266170ae9879b0651e6074e538a4de0a214c (patch)
treed5ecb647701534d6374f441f2c790bfdd2dca848 /src/codegen.rs
parent572d3097770cd8e5cd22d7767c1d18e0d50b9a90 (diff)
downloadsubplot-5a92266170ae9879b0651e6074e538a4de0a214c.tar.gz
various: Rework document to support multiple implementations
In order to eventually shift the document metadata to support more than one template defined for the document this reworks all the internal APIs to expect templates, and also the external CLI to be able to provide it. Signed-off-by: Daniel Silverstone <dsilvers@digital-scurf.org>
Diffstat (limited to 'src/codegen.rs')
-rw-r--r--src/codegen.rs32
1 files changed, 12 insertions, 20 deletions
diff --git a/src/codegen.rs b/src/codegen.rs
index b67d94a..b940b4d 100644
--- a/src/codegen.rs
+++ b/src/codegen.rs
@@ -9,28 +9,19 @@ use base64::encode;
use serde::Serialize;
use tera::{Context, Tera, Value};
-/// Return the requested template specification.
-pub fn template_spec(doc: &Document) -> Result<TemplateSpec, SubplotError> {
- let template = doc
- .meta()
- .template_name()
- .ok_or(SubplotError::MissingTemplate)?;
-
- let mut filename = PathBuf::from(template);
- filename.push("template");
- filename.push("template.yaml");
- TemplateSpec::from_file(&filename)
-}
-
/// Generate a test program from a document, using a template spec.
pub fn generate_test_program(
doc: &mut Document,
- spec: &TemplateSpec,
filename: &Path,
template: &str,
) -> Result<(), SubplotError> {
let context = context(doc, template)?;
- let code = tera(spec, template)?
+ let docimpl = doc
+ .meta()
+ .document_impl(template)
+ .ok_or(SubplotError::MissingTemplate)?;
+
+ let code = tera(docimpl.spec(), template)?
.render("template", &context)
.expect("render");
write(filename, &code)?;
@@ -43,12 +34,13 @@ fn context(doc: &mut Document, template: &str) -> Result<Context, SubplotError>
context.insert("scenarios", &scenarios);
context.insert("files", doc.files());
- let funcs_filenames = doc.meta().functions_filenames();
let mut funcs = vec![];
- for filename in funcs_filenames {
- let content = resource::read_as_string(filename, Some(template))
- .map_err(|err| SubplotError::FunctionsFileNotFound(filename.into(), err))?;
- funcs.push(Func::new(filename, content));
+ if let Some(docimpl) = doc.meta().document_impl(template) {
+ for filename in docimpl.functions_filenames() {
+ let content = resource::read_as_string(filename, Some(template))
+ .map_err(|err| SubplotError::FunctionsFileNotFound(filename.into(), err))?;
+ funcs.push(Func::new(filename, content));
+ }
}
context.insert("functions", &funcs);