@@ -23,13 +23,16 @@ use std::rc::Rc;
2323
2424use puml_lobster:: { write_lobster_to_file, LobsterModel } ;
2525use puml_parser:: {
26- DiagramParser , ErrorLocation , Preprocessor , PumlClassParser , PumlComponentParser ,
27- PumlSequenceParser ,
26+ DiagramParser , ErrorLocation , Preprocessor , PumlActivityParser , PumlClassParser ,
27+ PumlComponentParser , PumlSequenceParser ,
2828} ;
2929use puml_resolver:: {
30- ClassResolver , DiagramResolver , ElementResolver , LogicElement , SequenceResolver , SequenceTree ,
30+ ActivityDiagram , ActivityResolver , ClassResolver , DiagramResolver , ElementResolver ,
31+ LogicElement , SequenceResolver , SequenceTree ,
32+ } ;
33+ use puml_serializer:: {
34+ ActivitySerializer , ClassSerializer , ComponentSerializer , SequenceSerializer ,
3135} ;
32- use puml_serializer:: { ClassSerializer , ComponentSerializer , SequenceSerializer } ;
3336use puml_utils:: { write_fbs_to_file, write_json_to_file, LogLevel } ;
3437
3538/// CLI wrapper for LogLevel that implements ValueEnum
@@ -99,6 +102,7 @@ struct Args {
99102#[ derive( Copy , Clone , ValueEnum , Debug ) ]
100103enum DiagramType {
101104 None ,
105+ Activity ,
102106 Component ,
103107 Deployment ,
104108 Class ,
@@ -108,6 +112,7 @@ enum DiagramType {
108112#[ allow( dead_code) ] // Class and Sequence variants are WIP
109113#[ derive( Debug , Serialize ) ]
110114enum ParsedDiagram {
115+ Activity ( puml_parser:: RawActivityDiagram ) ,
111116 Component ( puml_parser:: CompPumlDocument ) ,
112117 Class ( puml_parser:: ClassUmlFile ) ,
113118 Sequence ( puml_parser:: SeqPumlDocument ) ,
@@ -191,6 +196,7 @@ fn run() -> Result<(), Box<dyn std::error::Error>> {
191196 let lobster_model = match & logic_result {
192197 ResolvedDiagram :: Component ( model) => LobsterModel :: Component ( model) ,
193198 ResolvedDiagram :: Class ( model) => LobsterModel :: Class ( model) ,
199+ ResolvedDiagram :: Activity ( _) => LobsterModel :: Empty ,
194200 ResolvedDiagram :: Sequence ( _) => LobsterModel :: Empty ,
195201 } ;
196202 write_lobster_to_file ( lobster_model, path, ldir) ?;
@@ -208,6 +214,9 @@ fn run() -> Result<(), Box<dyn std::error::Error>> {
208214
209215fn serialize_resolved_diagram ( resolved_content : & ResolvedDiagram , source_file : & str ) -> Vec < u8 > {
210216 match resolved_content {
217+ ResolvedDiagram :: Activity ( resolved_content) => {
218+ ActivitySerializer :: serialize ( resolved_content, source_file)
219+ }
211220 ResolvedDiagram :: Component ( resolved_content) => {
212221 ComponentSerializer :: serialize ( resolved_content, source_file)
213222 }
@@ -222,6 +231,7 @@ fn serialize_resolved_diagram(resolved_content: &ResolvedDiagram, source_file: &
222231
223232#[ derive( Debug , Serialize ) ]
224233pub enum ResolvedDiagram {
234+ Activity ( ActivityDiagram ) ,
225235 Component ( HashMap < String , LogicElement > ) ,
226236 Class ( class_diagram:: ClassDiagram ) ,
227237 Sequence ( SequenceTree ) ,
@@ -231,6 +241,10 @@ fn resolve_parsed_diagram(
231241 parsed_content : ParsedDiagram ,
232242) -> Result < ResolvedDiagram , Box < dyn std:: error:: Error > > {
233243 match parsed_content {
244+ ParsedDiagram :: Activity ( parsed_content) => {
245+ let mut resolver = ActivityResolver :: new ( ) ;
246+ puml_resolver ( & mut resolver, & parsed_content) . map ( ResolvedDiagram :: Activity )
247+ }
234248 ParsedDiagram :: Component ( parsed_content) => {
235249 let mut resolver = ElementResolver :: new ( ) ;
236250 puml_resolver ( & mut resolver, & parsed_content) . map ( ResolvedDiagram :: Component )
@@ -289,6 +303,10 @@ fn parse_puml_file(
289303 diagram_type : DiagramType ,
290304) -> Result < ParsedDiagram , Box < dyn std:: error:: Error > > {
291305 match diagram_type {
306+ DiagramType :: Activity => {
307+ parse_with_parser ( & mut PumlActivityParser , path, content, log_level)
308+ . map ( ParsedDiagram :: Activity )
309+ }
292310 DiagramType :: Component | DiagramType :: Deployment => {
293311 parse_with_parser ( & mut PumlComponentParser , path, content, log_level)
294312 . map ( ParsedDiagram :: Component )
@@ -326,6 +344,18 @@ fn parse_in_order(
326344 }
327345 }
328346
347+ match PumlActivityParser . parse_file ( path, content, log_level) {
348+ Ok ( doc) => {
349+ debug ! ( "Successfully detected as Activity diagram" ) ;
350+ return Ok ( ParsedDiagram :: Activity ( doc) ) ;
351+ }
352+ Err ( e) => {
353+ let loc = e. error_location ( ) ;
354+ debug ! ( "Activity parser failed at {:?}: {}" , loc, e) ;
355+ attempts. push ( ( "Activity" , Box :: new ( e) , loc) ) ;
356+ }
357+ }
358+
329359 match PumlClassParser . parse_file ( path, content, log_level) {
330360 Ok ( doc) => {
331361 debug ! ( "Successfully detected as Class diagram" ) ;
0 commit comments