Skip to content

Commit 849aae7

Browse files
melodyoncodehoe-jo
authored andcommitted
refactor(tools): separate metamodels and move serializers to tools/serialization
1 parent 7a32530 commit 849aae7

40 files changed

Lines changed: 408 additions & 444 deletions

File tree

cpp/libclang/src/visitor/BUILD

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ rust_library(
2525
],
2626
visibility = ["//cpp/libclang:__subpackages__"],
2727
deps = [
28-
"//tools/metamodel:class_diagram",
29-
"//tools/metamodel:sequence_diagram",
28+
"//tools/metamodel/class:class_diagram",
29+
"//tools/metamodel/sequence:sequence_diagram",
3030
"@crates//:clang",
3131
"@crates//:serde",
3232
],

plantuml/linker/BUILD

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ rust_binary(
1818
crate_root = "src/main.rs",
1919
visibility = ["//visibility:public"],
2020
deps = [
21-
"//plantuml/parser/puml_serializer/src/fbs:component_fbs",
21+
"//tools/serialization/flatbuffers/component:component_fbs",
2222
"@crates//:clap",
2323
"@crates//:env_logger",
2424
"@crates//:flatbuffers",

plantuml/parser/README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,4 +86,10 @@ Each diagram parser uses [pest](https://pest.rs/) PEG grammars to tokenize Plant
8686
then builds a typed AST. The CLI (`puml_cli`) dispatches to the appropriate parser based on
8787
`--diagram-type` or auto-detection.
8888

89+
Shared model and serialization crates are split by responsibility:
90+
91+
- `tools/metamodel/{class,component,sequence}` contains the logical model types.
92+
- `tools/serialization/flatbuffers/{class,component,sequence}` contains the FlatBuffers
93+
schemas and serializer crates that produce `.fbs.bin` outputs.
94+
8995
For the detailed design and users Guide, see `docs/README.md` in the source tree.

plantuml/parser/docs/README.md

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,9 @@ The AST is resolved into a logical model by the `ComponentResolver`:
5252

5353
#### 4. Serialization Phase
5454

55-
The resolved logical model is serialized to FlatBuffers binary format by `ComponentSerializer` for further downstream processing.
55+
The resolved logical model is serialized to FlatBuffers binary format for further downstream processing.
56+
The logical model types live under `tools/metamodel/{class,component,sequence}`,
57+
while the FlatBuffers schemas and serializers live under `tools/serialization/flatbuffers/{class,component,sequence}`.
5658

5759
**Example input**
5860

@@ -132,10 +134,16 @@ Interface(
132134
| `puml_utils` | Shared utilities: `LogLevel` enum, file writing helpers |
133135
| `puml_parser` | Preprocessor (include expansion) + Class / Component / Sequence diagram parsers |
134136
| `puml_resolver` | Resolves raw AST into logical model (`ComponentResolver`, `DiagramResolver` trait) |
135-
| `puml_serializer` | FlatBuffers serialization of the resolved model (`ComponentSerializer`) |
136137
| `puml_lobster` | Converts the resolved model to LOBSTER traceability JSON |
137138
| `puml_cli` | CLI argument parsing and orchestration of all phases |
138139

140+
### Shared Dependencies
141+
142+
| Module | Responsibility |
143+
|---|---|
144+
| `tools/metamodel` | Shared logical model crates for class/component/sequence diagrams, consumed by the PlantUML parser, validation, and C++ tooling |
145+
| `tools/serialization/flatbuffers` | FlatBuffers schemas and serializer crates for class/component/sequence models |
146+
139147
### Architecture Diagrams
140148

141149
**Class structure:**

plantuml/parser/integration_test/BUILD

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ rust_library(
2525
"//plantuml/parser/puml_parser",
2626
"//plantuml/parser/puml_resolver",
2727
"//plantuml/parser/puml_utils",
28-
"//tools/metamodel:class_diagram",
28+
"//tools/metamodel/class:class_diagram",
2929
"@crates//:serde",
3030
"@crates//:serde_json",
3131
"@crates//:serde_yaml",

plantuml/parser/integration_test/src/test_error_view.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ use puml_parser::{
1717
ActivityParserError, BaseParseError, ClassError, IncludeExpandError, IncludeParseError,
1818
PreprocessError, ProcedureExpandError, ProcedureParseError,
1919
};
20-
use puml_resolver::{ActivityResolverError, ClassPumlResolverError, ElementResolverError};
20+
use puml_resolver::{ActivityResolverError, ClassPumlResolverError, ComponentResolverError};
2121

2222
#[derive(Debug)]
2323
pub struct ProjectedError {
@@ -209,32 +209,32 @@ impl ErrorView for ActivityParserError {
209209
}
210210
}
211211

212-
impl ErrorView for ElementResolverError {
212+
impl ErrorView for ComponentResolverError {
213213
fn project(&self, _base_dir: &Path) -> ProjectedError {
214214
match self {
215-
ElementResolverError::UnresolvedReference { reference } => {
215+
ComponentResolverError::UnresolvedReference { reference } => {
216216
ProjectedError::new("UnresolvedReference")
217217
.with_field("reference", reference.clone())
218218
}
219219

220-
ElementResolverError::DuplicateElement { element_id } => {
220+
ComponentResolverError::DuplicateElement { element_id } => {
221221
ProjectedError::new("DuplicateComponent")
222222
.with_field("component_id", element_id.clone())
223223
}
224224

225-
ElementResolverError::UnknownElementType { element_type } => {
225+
ComponentResolverError::UnknownElementType { element_type } => {
226226
ProjectedError::new("UnknownComponentType")
227227
.with_field("component_type", element_type.clone())
228228
}
229229

230-
ElementResolverError::InvalidRelationship { from, to, reason } => {
230+
ComponentResolverError::InvalidRelationship { from, to, reason } => {
231231
ProjectedError::new("InvalidRelationship")
232232
.with_field("from", from.clone())
233233
.with_field("to", to.clone())
234234
.with_field("reason", reason.clone())
235235
}
236236

237-
ElementResolverError::AmbiguousReference {
237+
ComponentResolverError::AmbiguousReference {
238238
reference,
239239
candidates,
240240
} => ProjectedError::new("AmbiguousReference")

plantuml/parser/puml_cli/BUILD

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,13 @@ rust_binary(
2121
"//plantuml/parser/puml_lobster",
2222
"//plantuml/parser/puml_parser",
2323
"//plantuml/parser/puml_resolver",
24-
"//plantuml/parser/puml_serializer",
2524
"//plantuml/parser/puml_utils",
26-
"//tools/metamodel:class_diagram",
27-
"//tools/metamodel:sequence_diagram",
25+
"//tools/metamodel/class:class_diagram",
26+
"//tools/metamodel/component:component_diagram",
27+
"//tools/metamodel/sequence:sequence_diagram",
28+
"//tools/serialization/flatbuffers/class:class_serializer",
29+
"//tools/serialization/flatbuffers/component:component_serializer",
30+
"//tools/serialization/flatbuffers/sequence:sequence_serializer",
2831
"@crates//:clap",
2932
"@crates//:env_logger",
3033
"@crates//:log",
@@ -40,10 +43,13 @@ rust_test(
4043
"//plantuml/parser/puml_lobster",
4144
"//plantuml/parser/puml_parser",
4245
"//plantuml/parser/puml_resolver",
43-
"//plantuml/parser/puml_serializer",
4446
"//plantuml/parser/puml_utils",
45-
"//tools/metamodel:class_diagram",
46-
"//tools/metamodel:sequence_diagram",
47+
"//tools/metamodel/class:class_diagram",
48+
"//tools/metamodel/component:component_diagram",
49+
"//tools/metamodel/sequence:sequence_diagram",
50+
"//tools/serialization/flatbuffers/class:class_serializer",
51+
"//tools/serialization/flatbuffers/component:component_serializer",
52+
"//tools/serialization/flatbuffers/sequence:sequence_serializer",
4753
"@crates//:clap",
4854
"@crates//:env_logger",
4955
"@crates//:log",

plantuml/parser/puml_cli/src/main.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,21 +15,21 @@ use clap::{ArgGroup, Parser, ValueEnum};
1515
use env_logger::Builder;
1616
use log::debug;
1717
use serde::Serialize;
18-
use std::collections::HashMap;
19-
use std::collections::HashSet;
18+
use std::collections::{HashMap, HashSet};
2019
use std::fs;
2120
use std::path::{Path, PathBuf};
2221
use std::rc::Rc;
2322

23+
use class_serializer::ClassSerializer;
24+
use component_serializer::ComponentSerializer;
25+
use sequence_serializer::SequenceSerializer;
26+
2427
use puml_lobster::{write_lobster_to_file, LobsterModel};
2528
use puml_parser::{
2629
DiagramParser, ErrorLocation, Preprocessor, PumlClassParser, PumlComponentParser,
2730
PumlSequenceParser,
2831
};
29-
use puml_resolver::{
30-
ClassResolver, DiagramResolver, ElementResolver, LogicElement, SequenceResolver, SequenceTree,
31-
};
32-
use puml_serializer::{ClassSerializer, ComponentSerializer, SequenceSerializer};
32+
use puml_resolver::{ClassResolver, ComponentResolver, DiagramResolver, SequenceResolver};
3333
use puml_utils::{write_fbs_to_file, write_json_to_file, LogLevel};
3434

3535
/// CLI wrapper for LogLevel that implements ValueEnum
@@ -222,17 +222,17 @@ fn serialize_resolved_diagram(resolved_content: &ResolvedDiagram, source_file: &
222222

223223
#[derive(Debug, Serialize)]
224224
pub enum ResolvedDiagram {
225-
Component(HashMap<String, LogicElement>),
225+
Component(HashMap<String, component_diagram::LogicComponent>),
226226
Class(class_diagram::ClassDiagram),
227-
Sequence(SequenceTree),
227+
Sequence(sequence_logic::SequenceTree),
228228
}
229229

230230
fn resolve_parsed_diagram(
231231
parsed_content: ParsedDiagram,
232232
) -> Result<ResolvedDiagram, Box<dyn std::error::Error>> {
233233
match parsed_content {
234234
ParsedDiagram::Component(parsed_content) => {
235-
let mut resolver = ElementResolver::new();
235+
let mut resolver = ComponentResolver::new();
236236
puml_resolver(&mut resolver, &parsed_content).map(ResolvedDiagram::Component)
237237
}
238238
ParsedDiagram::Class(parsed_content) => {

plantuml/parser/puml_lobster/BUILD

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ rust_library(
1818
srcs = ["src/lib.rs"],
1919
visibility = ["//plantuml/parser:__subpackages__"],
2020
deps = [
21-
"//plantuml/parser/puml_resolver",
22-
"//tools/metamodel:class_diagram",
21+
"//tools/metamodel/class:class_diagram",
22+
"//tools/metamodel/component:component_diagram",
2323
"@crates//:serde_json",
2424
],
2525
)

plantuml/parser/puml_lobster/src/lib.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@
1414
//! Converts the resolved PlantUML logical model into a `lobster-imp-trace`
1515
//! JSON file compatible with the LOBSTER traceability toolchain.
1616
//!
17-
//! Only [`ElementType::Interface`] elements are emitted
17+
//! Only [`ComponentType::Interface`] elements are emitted
1818
1919
use class_diagram::{ClassDiagram, EntityType};
20-
use puml_resolver::{ElementType, LogicElement};
20+
use component_diagram::{ComponentType, LogicComponent};
2121
use serde_json::{json, Value};
2222
use std::collections::HashMap;
2323
use std::ffi::OsStr;
@@ -26,7 +26,7 @@ use std::io;
2626
use std::path::{Path, PathBuf};
2727

2828
pub enum LobsterModel<'a> {
29-
Component(&'a HashMap<String, LogicElement>),
29+
Component(&'a HashMap<String, LogicComponent>),
3030
Class(&'a ClassDiagram),
3131
Empty,
3232
}
@@ -36,10 +36,10 @@ pub enum LobsterModel<'a> {
3636
///
3737
/// `source_path` is embedded in the `location.file` field of every emitted
3838
/// item so that LOBSTER can trace items back to their source diagram.
39-
fn comp_model_to_lobster(model: &HashMap<String, LogicElement>, source_path: &str) -> Value {
39+
fn comp_model_to_lobster(model: &HashMap<String, LogicComponent>, source_path: &str) -> Value {
4040
let items: Vec<Value> = model
4141
.values()
42-
.filter(|element| element.element_type == ElementType::Interface)
42+
.filter(|element| element.element_type == ComponentType::Interface)
4343
.map(|element| build_lobster_item(&element.id, source_path, None, "Interface"))
4444
.collect();
4545

0 commit comments

Comments
 (0)