@@ -20,16 +20,20 @@ use std::fs;
2020use std:: path:: { Path , PathBuf } ;
2121use std:: rc:: Rc ;
2222
23+ use activity_diagram:: ActivityDiagram ;
24+ use activity_serializer:: ActivitySerializer ;
2325use class_serializer:: ClassSerializer ;
2426use component_serializer:: ComponentSerializer ;
2527use sequence_serializer:: SequenceSerializer ;
2628
2729use puml_lobster:: { write_lobster_to_file, LobsterModel } ;
2830use 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 } ;
3337use 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 ) ]
100104enum 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 ) ]
110115enum 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
209216fn 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 ) ]
224234pub 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" ) ;
0 commit comments