Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions framec/src/frame_c/ast.rs
Original file line number Diff line number Diff line change
Expand Up @@ -351,6 +351,9 @@ impl MachineBlockNode {
pub fn new(states: Vec<Rc<RefCell<StateNode>>>) -> MachineBlockNode {
MachineBlockNode { states }
}
pub fn get_first_state(&self) -> Option<&Rc<RefCell<StateNode>>> {
self.states.get(0)
}
}

impl NodeElement for MachineBlockNode {
Expand Down
16 changes: 8 additions & 8 deletions framec/src/frame_c/compiler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -241,13 +241,10 @@ impl Exe {
visitor.run(&system_node);
output = visitor.get_code();
} else if output_format == "plantuml" {
// let x = (&semantic_parser).get_arcanum();
// semantic_parser = semantic_parser.into_inner();
// let y = (&semantic_parser).get_system_hierarchy();
let (x, y) = semantic_parser.get_all();
let (arcanum, system_hierarchy) = semantic_parser.get_all();
let mut visitor = PlantUmlVisitor::new(
x,
y,
arcanum,
system_hierarchy,
generate_state_context,
generate_state_stack,
generate_change_state,
Expand All @@ -273,8 +270,11 @@ impl Exe {
visitor.run(&system_node);
output = visitor.get_code();
} else if output_format == "smcat" {
let (x, y) = semantic_parser.get_all();
let mut visitor = SmcatVisitor::new(x, y, FRAMEC_VERSION, comments);
let mut visitor = SmcatVisitor::new(
FRAMEC_VERSION,
config,
semantic_parser.get_system_hierarchy(),
);
visitor.run(&system_node);
output = visitor.get_code();
// } else if output_format == "xstate" {
Expand Down
72 changes: 64 additions & 8 deletions framec/src/frame_c/config.rs
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ impl FrameConfig {
pub struct CodeGenConfig {
pub common: CommonConfig,
pub rust: RustConfig,
pub smcat: SmcatConfig,
}

/// Code generation options shared among all backends.
Expand Down Expand Up @@ -168,6 +169,34 @@ pub struct RustCode {
pub state_cell_var_name: String,
}

/// Code generation options specific to the Smcat backend.
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct SmcatConfig {
pub features: SmcatFeatures,
pub code: SmcatCode,
}

/// Code generation features specific to the Smcat backend.
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct SmcatFeatures {}

/// Style options for generated code specific to the Smcat backend.
///
/// See the sections "colors and line width", "classes", and "overriding the
/// type of a state" in the smcat README:
/// <https://github.com/sverweij/state-machine-cat/blob/develop/README.md>
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct SmcatCode {
/// Style settings for nodes that do not have any children.
pub simple_state_node_style: String,
/// Style settings for nodes that have sub-states as children.
pub parent_state_node_style: String,
/// Style settings for "change-state" transitions.
pub change_state_edge_style: String,
/// Style settings for standard transitions.
pub transition_edge_style: String,
}

impl FrameConfig {
/// Generate a configuration from any `Provider`.
pub fn from<T: Provider>(provider: T) -> Result<FrameConfig, Error> {
Expand Down Expand Up @@ -288,24 +317,25 @@ impl Provider for SystemNode {
// Defaults

impl Default for FrameConfig {
fn default() -> FrameConfig {
fn default() -> Self {
FrameConfig {
codegen: CodeGenConfig::default(),
}
}
}

impl Default for CodeGenConfig {
fn default() -> CodeGenConfig {
fn default() -> Self {
CodeGenConfig {
common: CommonConfig::default(),
rust: RustConfig::default(),
smcat: SmcatConfig::default(),
}
}
}

impl Default for CommonConfig {
fn default() -> CommonConfig {
fn default() -> Self {
CommonConfig {
features: CommonFeatures::default(),
code: CommonCode::default(),
Expand All @@ -314,19 +344,19 @@ impl Default for CommonConfig {
}

impl Default for CommonFeatures {
fn default() -> CommonFeatures {
fn default() -> Self {
CommonFeatures {}
}
}

impl Default for CommonCode {
fn default() -> CommonCode {
fn default() -> Self {
CommonCode {}
}
}

impl Default for RustConfig {
fn default() -> RustConfig {
fn default() -> Self {
RustConfig {
features: RustFeatures::default(),
code: RustCode::default(),
Expand All @@ -335,7 +365,7 @@ impl Default for RustConfig {
}

impl Default for RustFeatures {
fn default() -> RustFeatures {
fn default() -> Self {
RustFeatures {
follow_rust_naming: true,
generate_action_impl: true,
Expand All @@ -346,7 +376,7 @@ impl Default for RustFeatures {
}

impl Default for RustCode {
fn default() -> RustCode {
fn default() -> Self {
RustCode {
action_prefix: String::from(""),
action_suffix: String::from(""),
Expand Down Expand Up @@ -408,3 +438,29 @@ impl Default for RustCode {
}
}
}

impl Default for SmcatConfig {
fn default() -> Self {
SmcatConfig {
features: SmcatFeatures::default(),
code: SmcatCode::default(),
}
}
}

impl Default for SmcatFeatures {
fn default() -> Self {
SmcatFeatures {}
}
}

impl Default for SmcatCode {
fn default() -> Self {
SmcatCode {
simple_state_node_style: String::from("class=\"state simple\""),
parent_state_node_style: String::from("class=\"state parent\""),
change_state_edge_style: String::from("class=\"edge change-state\""),
transition_edge_style: String::from("class=\"edge transition\""),
}
}
}
6 changes: 6 additions & 0 deletions framec/src/frame_c/parser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,12 @@ impl<'a> Parser<'a> {

/* --------------------------------------------------------------------- */

pub fn get_system_hierarchy(self) -> SystemHierarchy {
self.system_hierarchy_opt.unwrap()
}

/* --------------------------------------------------------------------- */

pub fn get_all(self) -> (Arcanum, SystemHierarchy) {
(self.arcanum, self.system_hierarchy_opt.unwrap())
}
Expand Down
Loading