@@ -243,28 +243,28 @@ impl PumlSequenceParser {
243243 pair : pest:: iterators:: Pair < Rule > ,
244244 source_location : SourceLocation ,
245245 ) -> Result < Message , SequenceError > {
246- let mut left: Option < String > = None ;
246+ let mut left: Option < MessageEndpoint > = None ;
247247 let mut arrow: Option < Arrow > = None ;
248- let mut right: Option < String > = None ;
249- let mut activation_marker : Option < String > = None ;
248+ let mut right: Option < MessageEndpoint > = None ;
249+ let mut suffix : Option < MessageSuffix > = None ;
250250 let mut description: Option < String > = None ;
251251
252252 for inner in pair. into_inner ( ) {
253253 match inner. as_rule ( ) {
254- Rule :: message_participant => {
255- let participant = Self :: extract_participant_ref ( inner) ;
254+ Rule :: message_endpoint => {
255+ let endpoint = Self :: parse_message_endpoint ( inner) ? ;
256256 // First participant goes to left, second to right
257257 if arrow. is_none ( ) {
258- left = Some ( participant ) ;
258+ left = Some ( endpoint ) ;
259259 } else {
260- right = Some ( participant ) ;
260+ right = Some ( endpoint ) ;
261261 }
262262 }
263263 Rule :: sequence_arrow => {
264264 arrow = Some ( Self :: parse_arrow ( inner) ?) ;
265265 }
266- Rule :: activation_marker => {
267- activation_marker = Some ( inner . as_str ( ) . to_string ( ) ) ;
266+ Rule :: message_suffix => {
267+ suffix = Some ( Self :: parse_message_suffix ( inner ) ) ;
268268 }
269269 Rule :: sequence_description => {
270270 description = inner
@@ -276,22 +276,73 @@ impl PumlSequenceParser {
276276 }
277277 }
278278
279- let content = MessageContent :: WithTargets {
280- left : left. unwrap_or_default ( ) ,
279+ Ok ( Message {
280+ left : left. expect ( "message must contain left endpoint" ) ,
281281 arrow : arrow. ok_or_else ( || {
282282 SequenceError :: InvalidStatement ( "missing arrow in message" . to_string ( ) )
283283 } ) ?,
284- right : right. unwrap_or_default ( ) ,
285- } ;
286-
287- Ok ( Message {
288- content,
289- activation_marker,
284+ right : right. expect ( "message must contain right endpoint" ) ,
285+ suffix,
290286 description,
291287 source_location,
292288 } )
293289 }
294290
291+ fn parse_message_endpoint (
292+ pair : pest:: iterators:: Pair < Rule > ,
293+ ) -> Result < MessageEndpoint , SequenceError > {
294+ let endpoint = pair
295+ . into_inner ( )
296+ . next ( )
297+ . expect ( "message_endpoint must contain an endpoint" ) ;
298+
299+ Ok ( match endpoint. as_rule ( ) {
300+ Rule :: inline_participant => {
301+ MessageEndpoint :: Participant ( Self :: parse_participant_identifier ( endpoint) ?)
302+ }
303+ Rule :: lost_found_marker => {
304+ MessageEndpoint :: LostFound ( Self :: parse_lost_found_marker ( endpoint) )
305+ }
306+ _ => unreachable ! (
307+ "message_endpoint grammar produced unsupported value: {:?}" ,
308+ endpoint. as_rule( )
309+ ) ,
310+ } )
311+ }
312+
313+ fn parse_lost_found_marker ( pair : pest:: iterators:: Pair < Rule > ) -> String {
314+ let marker = pair
315+ . into_inner ( )
316+ . next ( )
317+ . expect ( "lost_found_marker must contain a lost-found endpoint" ) ;
318+
319+ match marker. as_rule ( ) {
320+ Rule :: left_lost_found | Rule :: right_lost_found => marker. as_str ( ) . trim ( ) . to_string ( ) ,
321+ _ => unreachable ! (
322+ "lost_found_marker grammar produced unsupported value: {:?}" ,
323+ marker. as_rule( )
324+ ) ,
325+ }
326+ }
327+
328+ fn parse_message_suffix ( pair : pest:: iterators:: Pair < Rule > ) -> MessageSuffix {
329+ let suffix = pair
330+ . into_inner ( )
331+ . next ( )
332+ . expect ( "message_suffix must contain a suffix" ) ;
333+
334+ match suffix. as_rule ( ) {
335+ Rule :: activate_suffix => MessageSuffix :: Activate ,
336+ Rule :: deactivate_suffix => MessageSuffix :: Deactivate ,
337+ Rule :: create_suffix => MessageSuffix :: Create ,
338+ Rule :: destroy_suffix => MessageSuffix :: Destroy ,
339+ _ => unreachable ! (
340+ "message_suffix grammar produced unsupported value: {:?}" ,
341+ suffix. as_rule( )
342+ ) ,
343+ }
344+ }
345+
295346 fn parse_arrow ( pair : pest:: iterators:: Pair < Rule > ) -> Result < Arrow , SequenceError > {
296347 common_parse_arrow ( pair)
297348 . map_err ( |e| SequenceError :: InvalidStatement ( format ! ( "invalid arrow: {}" , e) ) )
@@ -433,12 +484,6 @@ impl PumlSequenceParser {
433484
434485 fn extract_participant_ref ( pair : pest:: iterators:: Pair < Rule > ) -> String {
435486 match pair. as_rule ( ) {
436- Rule :: message_participant => pair
437- . into_inner ( )
438- . next ( )
439- . map ( Self :: extract_participant_ref)
440- . unwrap_or_default ( ) ,
441-
442487 Rule :: participant_ref => {
443488 let fallback = pair. as_str ( ) . trim ( ) ;
444489
0 commit comments