@@ -883,7 +883,7 @@ impl Params {
883883}
884884
885885pub mod prefixed_ulid {
886- use crate :: { JoinSetId , JoinSetIdParseError } ;
886+ use crate :: { JoinSetId , JoinSetIdParseError , JoinSetKind } ;
887887 use serde_with:: { DeserializeFromStr , SerializeDisplay } ;
888888 use std:: {
889889 fmt:: { Debug , Display } ,
@@ -1028,7 +1028,7 @@ pub mod prefixed_ulid {
10281028 pub type ExecutorId = PrefixedUlid < prefix:: Exr > ;
10291029 pub type ExecutionIdTopLevel = PrefixedUlid < prefix:: E > ;
10301030 pub type RunId = PrefixedUlid < prefix:: Run > ;
1031- pub type DelayId = PrefixedUlid < prefix:: Delay > ;
1031+ pub type DelayIdTopLevel = PrefixedUlid < prefix:: Delay > ;
10321032
10331033 #[ cfg( any( test, feature = "test" ) ) ]
10341034 impl < ' a , T > arbitrary:: Arbitrary < ' a > for PrefixedUlid < T > {
@@ -1147,26 +1147,32 @@ pub mod prefixed_ulid {
11471147 }
11481148 }
11491149 impl FromStr for ExecutionIdDerived {
1150- type Err = ExecutionIdDerivedParseError ;
1150+ type Err = DerivedIdParseError ;
11511151
11521152 fn from_str ( input : & str ) -> Result < Self , Self :: Err > {
1153- if let Some ( ( prefix, suffix) ) = input. split_once ( EXECUTION_ID_INFIX ) {
1154- let top_level = PrefixedUlid :: from_str ( prefix)
1155- . map_err ( ExecutionIdDerivedParseError :: PrefixedUlidParseError ) ?;
1156- let Some ( ( infix, idx) ) = suffix. rsplit_once ( EXECUTION_ID_JOIN_SET_INFIX ) else {
1157- return Err ( ExecutionIdDerivedParseError :: SecondDelimiterNotFound ) ;
1158- } ;
1159- let infix = Arc :: from ( infix) ;
1160- let idx =
1161- u64:: from_str ( idx) . map_err ( ExecutionIdDerivedParseError :: ParseIndexError ) ?;
1162- Ok ( ExecutionIdDerived {
1163- top_level,
1164- infix,
1165- idx,
1166- } )
1167- } else {
1168- Err ( ExecutionIdDerivedParseError :: FirstDelimiterNotFound )
1169- }
1153+ let ( top_level, infix, idx) = derived_from_str ( input) ?;
1154+ Ok ( ExecutionIdDerived {
1155+ top_level,
1156+ infix,
1157+ idx,
1158+ } )
1159+ }
1160+ }
1161+
1162+ fn derived_from_str < T : ' static > (
1163+ input : & str ,
1164+ ) -> Result < ( PrefixedUlid < T > , Arc < str > , u64 ) , DerivedIdParseError > {
1165+ if let Some ( ( prefix, suffix) ) = input. split_once ( EXECUTION_ID_INFIX ) {
1166+ let top_level = PrefixedUlid :: from_str ( prefix)
1167+ . map_err ( DerivedIdParseError :: PrefixedUlidParseError ) ?;
1168+ let Some ( ( infix, idx) ) = suffix. rsplit_once ( EXECUTION_ID_JOIN_SET_INFIX ) else {
1169+ return Err ( DerivedIdParseError :: SecondDelimiterNotFound ) ;
1170+ } ;
1171+ let infix = Arc :: from ( infix) ;
1172+ let idx = u64:: from_str ( idx) . map_err ( DerivedIdParseError :: ParseIndexError ) ?;
1173+ Ok ( ( top_level, infix, idx) )
1174+ } else {
1175+ Err ( DerivedIdParseError :: FirstDelimiterNotFound )
11701176 }
11711177 }
11721178
@@ -1180,17 +1186,15 @@ pub mod prefixed_ulid {
11801186 }
11811187
11821188 #[ derive( Debug , thiserror:: Error ) ]
1183- pub enum ExecutionIdDerivedParseError {
1189+ pub enum DerivedIdParseError {
11841190 #[ error( transparent) ]
11851191 PrefixedUlidParseError ( PrefixedUlidParseError ) ,
1186- #[ error( "cannot parse derived execution id - delimiter `{EXECUTION_ID_INFIX}` not found" ) ]
1192+ #[ error( "cannot parse derived id - delimiter `{EXECUTION_ID_INFIX}` not found" ) ]
11871193 FirstDelimiterNotFound ,
1188- #[ error(
1189- "cannot parse derived execution id - delimiter `{EXECUTION_ID_JOIN_SET_INFIX}` not found"
1190- ) ]
1194+ #[ error( "cannot parse derived id - delimiter `{EXECUTION_ID_JOIN_SET_INFIX}` not found" ) ]
11911195 SecondDelimiterNotFound ,
11921196 #[ error(
1193- "cannot parse derived execution id - suffix after `{EXECUTION_ID_JOIN_SET_INFIX}` must be a number"
1197+ "cannot parse derived id - suffix after `{EXECUTION_ID_JOIN_SET_INFIX}` must be a number"
11941198 ) ]
11951199 ParseIndexError ( ParseIntError ) ,
11961200 }
@@ -1291,16 +1295,16 @@ pub mod prefixed_ulid {
12911295 ExecutionIdDerived :: from_str ( input)
12921296 . map ( ExecutionId :: Derived )
12931297 . map_err ( |err| match err {
1294- ExecutionIdDerivedParseError :: FirstDelimiterNotFound => {
1298+ DerivedIdParseError :: FirstDelimiterNotFound => {
12951299 unreachable ! ( "first delimiter checked" )
12961300 }
1297- ExecutionIdDerivedParseError :: SecondDelimiterNotFound => {
1301+ DerivedIdParseError :: SecondDelimiterNotFound => {
12981302 ExecutionIdParseError :: SecondDelimiterNotFound
12991303 }
1300- ExecutionIdDerivedParseError :: PrefixedUlidParseError ( err) => {
1304+ DerivedIdParseError :: PrefixedUlidParseError ( err) => {
13011305 ExecutionIdParseError :: PrefixedUlidParseError ( err)
13021306 }
1303- ExecutionIdDerivedParseError :: ParseIndexError ( err) => {
1307+ DerivedIdParseError :: ParseIndexError ( err) => {
13041308 ExecutionIdParseError :: ParseIndexError ( err)
13051309 }
13061310 } )
@@ -1354,6 +1358,94 @@ pub mod prefixed_ulid {
13541358 Ok ( ExecutionId :: TopLevel ( PrefixedUlid :: arbitrary ( u) ?) )
13551359 }
13561360 }
1361+
1362+ #[ derive( Hash , PartialEq , Eq , PartialOrd , Ord , Clone , SerializeDisplay , DeserializeFromStr ) ]
1363+ pub struct DelayId {
1364+ top_level : DelayIdTopLevel ,
1365+ infix : Arc < str > ,
1366+ idx : u64 ,
1367+ }
1368+ impl DelayId {
1369+ #[ must_use]
1370+ pub fn new_oneoff ( execution_id : & ExecutionId , join_set_id : & JoinSetId ) -> DelayId {
1371+ assert ! ( join_set_id. kind == JoinSetKind :: OneOff ) ;
1372+ let ExecutionIdDerived {
1373+ top_level,
1374+ infix,
1375+ idx,
1376+ } = execution_id. next_level ( join_set_id) ;
1377+ let top_level = DelayIdTopLevel :: new ( top_level. ulid ) ;
1378+ DelayId {
1379+ top_level,
1380+ infix,
1381+ idx,
1382+ }
1383+ }
1384+
1385+ #[ must_use]
1386+ pub fn get_incremented ( & self ) -> Self {
1387+ Self {
1388+ top_level : self . top_level ,
1389+ infix : self . infix . clone ( ) ,
1390+ idx : self . idx + 1 ,
1391+ }
1392+ }
1393+
1394+ fn display_or_debug ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
1395+ let DelayId {
1396+ top_level,
1397+ infix,
1398+ idx,
1399+ } = self ;
1400+ write ! (
1401+ f,
1402+ "{top_level}{EXECUTION_ID_INFIX}{infix}{EXECUTION_ID_JOIN_SET_INFIX}{idx}"
1403+ )
1404+ }
1405+ }
1406+
1407+ pub mod delay_impl {
1408+ use super :: { DelayId , DerivedIdParseError , derived_from_str} ;
1409+ use std:: {
1410+ fmt:: { Debug , Display } ,
1411+ str:: FromStr ,
1412+ } ;
1413+
1414+ impl Debug for DelayId {
1415+ fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
1416+ self . display_or_debug ( f)
1417+ }
1418+ }
1419+
1420+ impl Display for DelayId {
1421+ fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
1422+ self . display_or_debug ( f)
1423+ }
1424+ }
1425+
1426+ impl FromStr for DelayId {
1427+ type Err = DerivedIdParseError ;
1428+
1429+ fn from_str ( input : & str ) -> Result < Self , Self :: Err > {
1430+ let ( top_level, infix, idx) = derived_from_str ( input) ?;
1431+ Ok ( DelayId {
1432+ top_level,
1433+ infix,
1434+ idx,
1435+ } )
1436+ }
1437+ }
1438+
1439+ #[ cfg( any( test, feature = "test" ) ) ]
1440+ impl < ' a > arbitrary:: Arbitrary < ' a > for DelayId {
1441+ fn arbitrary ( u : & mut arbitrary:: Unstructured < ' a > ) -> arbitrary:: Result < Self > {
1442+ use super :: { ExecutionId , JoinSetId } ;
1443+ let execution_id = ExecutionId :: arbitrary ( u) ?;
1444+ let join_set_id = JoinSetId :: arbitrary ( u) ?;
1445+ Ok ( DelayId :: new_oneoff ( & execution_id, & join_set_id) )
1446+ }
1447+ }
1448+ }
13571449}
13581450
13591451#[ derive(
0 commit comments