[][src]Module scdlang::external

Collection of Trait for extending core functionality. Useful for creating transpiler, codegen, or even compiler.

Examples

  1. Implement trait Parser on struct with Scdlang field (or any type that implement Builder).
#[derive(Default)]
pub struct Machine<'a> {
	builder: Scdlang<'a>, // or any type that implmenet trait `Builder`
	schema: std::any::Any,
}

impl Machine<'_> {
	pub fn new() -> Self {
		let mut builder = Scdlang::new();
		// insert any pre-configuration here. For example:
		// builder.auto_clear_cache(false)
		Self { builder, ..Default::default() }
	}
}

impl<'a> Parser<'a> for Machine<'a> {
	fn configure(&mut self) -> &mut Builder<'a> {
		&mut self.builder
	}

	fn parse(&mut self, source: &str) -> Result<(), DynError> {
		self.clean_cache()?;
		unimplemented!();
	}

	fn insert_parse(&mut self, source: &str) -> Result<(), Box<dyn error::Error>> {
		unimplemented!();
	}

	fn try_parse(source: &str, builder: Scdlang<'a>) -> Result<Self, Box<dyn error::Error>> {
		unimplemented!();
	}
}
  1. Then it can be used like this:
This example is not tested
let parser: Box<dyn Parser> = Box::new(match args {
	Some(text) => module_a::Machine::try_parse(text)?,
	None => module_b::Machine::new(),
});

parser.configure()
	.auto_clear_cache(false)
	.with_err_path("my_fsm.scl");

parser.parse("Off -> On")?;
parser.insert_parse("Off <- On @ Shutdown")?;

parser.configure().with_err_semantic(false);
parser.parse("Off -> On @ Power")?;

Traits

Builder

A Trait to configure the Parser. This is a config builder for Scdlang core parser.

Parser

A Trait which external parser must implement.