Skip to content

Commit 393fabe

Browse files
activity diagram serializer
1 parent c310490 commit 393fabe

10 files changed

Lines changed: 486 additions & 7 deletions

File tree

plantuml/parser/puml_cli/BUILD

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,11 @@ rust_binary(
2222
"//plantuml/parser/puml_parser",
2323
"//plantuml/parser/puml_resolver",
2424
"//plantuml/parser/puml_utils",
25+
"//tools/metamodel/activity:activity_diagram",
2526
"//tools/metamodel/class:class_diagram",
2627
"//tools/metamodel/component:component_diagram",
2728
"//tools/metamodel/sequence:sequence_diagram",
29+
"//tools/serialization/flatbuffers/activity:activity_serializer",
2830
"//tools/serialization/flatbuffers/class:class_serializer",
2931
"//tools/serialization/flatbuffers/component:component_serializer",
3032
"//tools/serialization/flatbuffers/sequence:sequence_serializer",
@@ -44,9 +46,11 @@ rust_test(
4446
"//plantuml/parser/puml_parser",
4547
"//plantuml/parser/puml_resolver",
4648
"//plantuml/parser/puml_utils",
49+
"//tools/metamodel/activity:activity_diagram",
4750
"//tools/metamodel/class:class_diagram",
4851
"//tools/metamodel/component:component_diagram",
4952
"//tools/metamodel/sequence:sequence_diagram",
53+
"//tools/serialization/flatbuffers/activity:activity_serializer",
5054
"//tools/serialization/flatbuffers/class:class_serializer",
5155
"//tools/serialization/flatbuffers/component:component_serializer",
5256
"//tools/serialization/flatbuffers/sequence:sequence_serializer",

plantuml/parser/puml_cli/src/main.rs

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,20 @@ use std::fs;
2020
use std::path::{Path, PathBuf};
2121
use std::rc::Rc;
2222

23+
use activity_diagram::ActivityDiagram;
24+
use activity_serializer::ActivitySerializer;
2325
use class_serializer::ClassSerializer;
2426
use component_serializer::ComponentSerializer;
2527
use sequence_serializer::SequenceSerializer;
2628

2729
use puml_lobster::{write_lobster_to_file, LobsterModel};
2830
use puml_parser::{
29-
DiagramParser, ErrorLocation, Preprocessor, PumlClassParser, PumlComponentParser,
30-
PumlSequenceParser,
31+
DiagramParser, ErrorLocation, Preprocessor, PumlActivityParser, PumlClassParser,
32+
PumlComponentParser, PumlSequenceParser,
33+
};
34+
use puml_resolver::{
35+
ActivityResolver, ClassResolver, ComponentResolver, DiagramResolver, SequenceResolver,
3136
};
32-
use puml_resolver::{ClassResolver, ComponentResolver, DiagramResolver, SequenceResolver};
3337
use puml_utils::{write_fbs_to_file, write_json_to_file, LogLevel};
3438

3539
/// CLI wrapper for LogLevel that implements ValueEnum
@@ -99,6 +103,7 @@ struct Args {
99103
#[derive(Copy, Clone, ValueEnum, Debug)]
100104
enum DiagramType {
101105
None,
106+
Activity,
102107
Component,
103108
Deployment,
104109
Class,
@@ -108,6 +113,7 @@ enum DiagramType {
108113
#[allow(dead_code)] // Class and Sequence variants are WIP
109114
#[derive(Debug, Serialize)]
110115
enum ParsedDiagram {
116+
Activity(puml_parser::RawActivityDiagram),
111117
Component(puml_parser::CompPumlDocument),
112118
Class(puml_parser::ClassUmlFile),
113119
Sequence(puml_parser::SeqPumlDocument),
@@ -191,6 +197,7 @@ fn run() -> Result<(), Box<dyn std::error::Error>> {
191197
let lobster_model = match &logic_result {
192198
ResolvedDiagram::Component(model) => LobsterModel::Component(model),
193199
ResolvedDiagram::Class(model) => LobsterModel::Class(model),
200+
ResolvedDiagram::Activity(_) => LobsterModel::Empty,
194201
ResolvedDiagram::Sequence(_) => LobsterModel::Empty,
195202
};
196203
write_lobster_to_file(lobster_model, path, ldir)?;
@@ -208,6 +215,9 @@ fn run() -> Result<(), Box<dyn std::error::Error>> {
208215

209216
fn serialize_resolved_diagram(resolved_content: &ResolvedDiagram, source_file: &str) -> Vec<u8> {
210217
match resolved_content {
218+
ResolvedDiagram::Activity(resolved_content) => {
219+
ActivitySerializer::serialize(resolved_content, source_file)
220+
}
211221
ResolvedDiagram::Component(resolved_content) => {
212222
ComponentSerializer::serialize(resolved_content, source_file)
213223
}
@@ -222,6 +232,7 @@ fn serialize_resolved_diagram(resolved_content: &ResolvedDiagram, source_file: &
222232

223233
#[derive(Debug, Serialize)]
224234
pub enum ResolvedDiagram {
235+
Activity(ActivityDiagram),
225236
Component(HashMap<String, component_diagram::LogicComponent>),
226237
Class(class_diagram::ClassDiagram),
227238
Sequence(sequence_logic::SequenceTree),
@@ -231,6 +242,10 @@ fn resolve_parsed_diagram(
231242
parsed_content: ParsedDiagram,
232243
) -> Result<ResolvedDiagram, Box<dyn std::error::Error>> {
233244
match parsed_content {
245+
ParsedDiagram::Activity(parsed_content) => {
246+
let mut resolver = ActivityResolver::new();
247+
puml_resolver(&mut resolver, &parsed_content).map(ResolvedDiagram::Activity)
248+
}
234249
ParsedDiagram::Component(parsed_content) => {
235250
let mut resolver = ComponentResolver::new();
236251
puml_resolver(&mut resolver, &parsed_content).map(ResolvedDiagram::Component)
@@ -289,6 +304,10 @@ fn parse_puml_file(
289304
diagram_type: DiagramType,
290305
) -> Result<ParsedDiagram, Box<dyn std::error::Error>> {
291306
match diagram_type {
307+
DiagramType::Activity => {
308+
parse_with_parser(&mut PumlActivityParser, path, content, log_level)
309+
.map(ParsedDiagram::Activity)
310+
}
292311
DiagramType::Component | DiagramType::Deployment => {
293312
parse_with_parser(&mut PumlComponentParser, path, content, log_level)
294313
.map(ParsedDiagram::Component)
@@ -326,6 +345,18 @@ fn parse_in_order(
326345
}
327346
}
328347

348+
match PumlActivityParser.parse_file(path, content, log_level) {
349+
Ok(doc) => {
350+
debug!("Successfully detected as Activity diagram");
351+
return Ok(ParsedDiagram::Activity(doc));
352+
}
353+
Err(e) => {
354+
let loc = e.error_location();
355+
debug!("Activity parser failed at {:?}: {}", loc, e);
356+
attempts.push(("Activity", Box::new(e), loc));
357+
}
358+
}
359+
329360
match PumlClassParser.parse_file(path, content, log_level) {
330361
Ok(doc) => {
331362
debug!("Successfully detected as Class diagram");

plantuml/parser/puml_resolver/src/activity_diagram/BUILD

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ load("@rules_rust//rust:defs.bzl", "rust_library", "rust_test")
1515
rust_library(
1616
name = "puml_resolver_activity",
1717
srcs = [
18-
"src/activity_logic.rs",
1918
"src/activity_resolver.rs",
2019
"src/lib.rs",
2120
],
@@ -25,6 +24,7 @@ rust_library(
2524
deps = [
2625
"//plantuml/parser/puml_parser:activity_diagram",
2726
"//plantuml/parser/puml_resolver:resolver_traits",
27+
"//tools/metamodel/activity:activity_diagram",
2828
"@crates//:serde",
2929
"@crates//:thiserror",
3030
],
@@ -47,5 +47,6 @@ rust_test(
4747
"//plantuml/parser/puml_parser:parser_core",
4848
"//plantuml/parser/puml_resolver:resolver_traits",
4949
"//plantuml/parser/puml_utils",
50+
"//tools/metamodel/activity:activity_diagram",
5051
],
5152
)

plantuml/parser/puml_resolver/src/activity_diagram/src/activity_resolver.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
// SPDX-License-Identifier: Apache-2.0
1212
// *******************************************************************************
1313

14-
use crate::activity_logic::{
14+
use activity_diagram::{
1515
ActionNode, ActivityDiagram, ActivityStmt, BackwardNode, ControlKind, ControlNode, IfDisplay,
1616
IfNode, LoopDisplay, RepeatWhileNode, TitleNode, WhileNode,
1717
};

plantuml/parser/puml_resolver/src/activity_diagram/src/lib.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,9 @@
1111
// SPDX-License-Identifier: Apache-2.0
1212
// *******************************************************************************
1313

14-
mod activity_logic;
1514
mod activity_resolver;
1615

17-
pub use activity_logic::{
16+
pub use activity_diagram::{
1817
ActionNode, ActivityDiagram, ActivityStmt, BackwardNode, ControlKind, ControlNode, IfDisplay,
1918
IfNode, LoopDisplay, RepeatWhileNode, TitleNode, WhileNode,
2019
};

tools/metamodel/activity/BUILD

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# *******************************************************************************
2+
# Copyright (c) 2026 Contributors to the Eclipse Foundation
3+
#
4+
# See the NOTICE file(s) distributed with this work for additional
5+
# information regarding copyright ownership.
6+
#
7+
# This program and the accompanying materials are made available under the
8+
# terms of the Apache License Version 2.0 which is available at
9+
# https://www.apache.org/licenses/LICENSE-2.0
10+
#
11+
# SPDX-License-Identifier: Apache-2.0
12+
# *******************************************************************************
13+
load("@rules_rust//rust:defs.bzl", "rust_library")
14+
15+
package(default_visibility = ["//visibility:public"])
16+
17+
rust_library(
18+
name = "activity_diagram",
19+
srcs = ["activity_logic.rs"],
20+
crate_name = "activity_diagram",
21+
crate_root = "activity_logic.rs",
22+
edition = "2021",
23+
deps = [
24+
"@crates//:serde",
25+
],
26+
)

plantuml/parser/puml_resolver/src/activity_diagram/src/activity_logic.rs renamed to tools/metamodel/activity/activity_logic.rs

File renamed without changes.
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
# *******************************************************************************
2+
# Copyright (c) 2026 Contributors to the Eclipse Foundation
3+
#
4+
# See the NOTICE file(s) distributed with this work for additional
5+
# information regarding copyright ownership.
6+
#
7+
# This program and the accompanying materials are made available under the
8+
# terms of the Apache License Version 2.0 which is available at
9+
# https://www.apache.org/licenses/LICENSE-2.0
10+
#
11+
# SPDX-License-Identifier: Apache-2.0
12+
# *******************************************************************************
13+
load("@flatbuffers//:build_defs.bzl", "flatbuffer_library_public")
14+
load("@rules_rust//rust:defs.bzl", "rust_library")
15+
16+
package(default_visibility = ["//visibility:public"])
17+
18+
flatbuffer_library_public(
19+
name = "activity_fbs_codegen",
20+
srcs = ["activity_diagram.fbs"],
21+
outs = ["activity_diagram_generated.rs"],
22+
flatc_args = [],
23+
language_flag = "--rust",
24+
)
25+
26+
rust_library(
27+
name = "activity_fbs",
28+
srcs = [":activity_fbs_codegen"],
29+
# Generated code from flatc - suppress all lints we can't fix
30+
rustc_flags = ["--cap-lints=allow"],
31+
deps = [
32+
"@crates//:flatbuffers",
33+
],
34+
)
35+
36+
rust_library(
37+
name = "activity_serializer",
38+
srcs = ["activity_serializer.rs"],
39+
crate_name = "activity_serializer",
40+
crate_root = "activity_serializer.rs",
41+
edition = "2021",
42+
deps = [
43+
":activity_fbs",
44+
"//tools/metamodel/activity:activity_diagram",
45+
"@crates//:flatbuffers",
46+
],
47+
)
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
// *******************************************************************************
2+
// Copyright (c) 2026 Contributors to the Eclipse Foundation
3+
//
4+
// See the NOTICE file(s) distributed with this work for additional
5+
// information regarding copyright ownership.
6+
//
7+
// This program and the accompanying materials are made available under the
8+
// terms of the Apache License Version 2.0 which is available at
9+
// https://www.apache.org/licenses/LICENSE-2.0
10+
//
11+
// SPDX-License-Identifier: Apache-2.0
12+
// *******************************************************************************
13+
14+
namespace activity;
15+
16+
enum ControlKind:byte {
17+
Stop,
18+
Kill,
19+
Detach,
20+
Break,
21+
Continue
22+
}
23+
24+
table IfDisplay {
25+
then_label:string;
26+
else_label:string;
27+
}
28+
29+
table LoopDisplay {
30+
continue_label:string;
31+
exit_label:string;
32+
}
33+
34+
table TitleNode {
35+
text:string;
36+
}
37+
38+
table ActionNode {
39+
label:string;
40+
}
41+
42+
table BackwardNode {
43+
label:string;
44+
}
45+
46+
table ControlNode {
47+
kind:ControlKind = Stop;
48+
}
49+
50+
table IfNode {
51+
condition:string;
52+
body:[ActivityStmt];
53+
else_branch:[ActivityStmt];
54+
display:IfDisplay;
55+
}
56+
57+
table WhileNode {
58+
condition:string;
59+
body:[ActivityStmt];
60+
backward:BackwardNode;
61+
display:LoopDisplay;
62+
}
63+
64+
table RepeatWhileNode {
65+
body:[ActivityStmt];
66+
condition:string;
67+
backward:BackwardNode;
68+
display:LoopDisplay;
69+
}
70+
71+
union ActivityStmtValue {
72+
TitleNode,
73+
ActionNode,
74+
IfNode,
75+
WhileNode,
76+
RepeatWhileNode,
77+
ControlNode
78+
}
79+
80+
table ActivityStmt {
81+
value:ActivityStmtValue;
82+
}
83+
84+
table ActivityDiagram {
85+
name:string;
86+
statements:[ActivityStmt];
87+
source_file:string;
88+
}
89+
90+
root_type ActivityDiagram;

0 commit comments

Comments
 (0)