PipelineId

Struct PipelineId 

Source
pub struct PipelineId(/* private fields */);
Expand description

Pipeline entity identifier value object for type-safe pipeline management

This value object provides type-safe pipeline identification with temporal ordering, pipeline lifecycle management, and comprehensive validation capabilities. It implements Domain-Driven Design (DDD) value object patterns with immutable semantics.

§Key Features

  • Type Safety: Strongly-typed pipeline identifiers that cannot be confused with other IDs
  • Temporal Ordering: ULID-based time-ordered creation sequence for pipeline management
  • Pipeline Lifecycle: Natural chronological ordering for audit trails and processing
  • Cross-Platform: Consistent representation across languages and storage systems
  • Validation: Comprehensive pipeline-specific validation and business rules
  • Serialization: Full serialization support for storage and API integration

§Benefits Over Raw ULIDs

  • Type Safety: PipelineId cannot be confused with StageId or other entity IDs
  • Domain Semantics: Clear intent in function signatures and business logic
  • Validation: Pipeline-specific validation rules and constraints
  • Future Evolution: Extensible for pipeline-specific methods and features

§Usage Examples

§Cross-Language Mapping

  • Rust: PipelineId newtype wrapper with full validation
  • Go: PipelineID struct with equivalent interface
  • JSON: String representation of ULID for API compatibility
  • Database: TEXT column with ULID string storage

Implementations§

Source§

impl PipelineId

Source

pub fn new() -> Self

Creates a new pipeline ID with current timestamp

§Purpose

Generates a unique, time-ordered pipeline identifier using ULID. Each ID captures the exact moment of pipeline creation.

§Why

Time-ordered pipeline IDs provide:

  • Natural chronological sorting for audit trails
  • Efficient range queries by creation time
  • Guaranteed uniqueness with 128-bit randomness
  • No coordination needed across distributed systems
§Time Ordering

Pipeline IDs are naturally sorted by creation time, making them perfect for chronological pipeline processing and audit trails.

§Returns

New PipelineId with current millisecond timestamp

§Examples
Source

pub fn from_ulid(ulid: Ulid) -> Result<Self, PipelineError>

Creates a pipeline ID from an existing ULID

§Use Cases
  • Deserializing from database
  • Converting from external systems
  • Testing with known IDs
Source

pub fn from_string(s: &str) -> Result<Self, PipelineError>

Creates a pipeline ID from a string representation

§Purpose

Parses and validates a pipeline ID from its ULID string representation. Used for deserialization, API input, and database retrieval.

§Why

String parsing enables:

  • RESTful API integration
  • Database round-trip serialization
  • Configuration file support
  • Cross-language interoperability
§Format

Accepts standard ULID string format (26 characters, base32 encoded) Example: “01ARZ3NDEKTSV4RRFFQ69G5FAV”

§Arguments
  • s - ULID string (26 characters, Crockford Base32)
§Returns
  • Ok(PipelineId) - Valid pipeline ID
  • Err(PipelineError::InvalidConfiguration) - Invalid ULID format
§Errors

Returns PipelineError::InvalidConfiguration when:

  • String is not 26 characters
  • Contains invalid Base32 characters
  • Validation rules fail
§Examples
Source

pub fn from_timestamp_ms(timestamp_ms: u64) -> Self

Creates a pipeline ID from a timestamp (useful for range queries)

§Purpose

Generates a pipeline ID with a specific timestamp. Primary use case is creating boundary IDs for time-range queries.

§Why

Timestamp-based IDs enable:

  • Efficient time-range queries (“created after midnight”)
  • Time-based pagination in databases
  • Migration from timestamp-based systems
  • Reproducible IDs for testing
§Arguments
  • timestamp_ms - Milliseconds since Unix epoch
§Returns

PipelineId with specified timestamp (random component generated)

§Use Cases
  • Creating boundary IDs for time-range queries
  • “Find all pipelines created after midnight”
  • Time-based pagination
  • Migration from timestamp-based systems
§Examples
Source

pub fn as_ulid(&self) -> Ulid

Gets the underlying ULID value

§Use Cases
  • Database storage
  • External API integration
  • Logging and debugging
Source

pub fn timestamp_ms(&self) -> u64

Gets the timestamp component of the pipeline ID

§Returns

Milliseconds since Unix epoch when this pipeline ID was created

§Use Cases
  • Time-range queries
  • Debugging pipeline creation times
  • Audit trails and compliance
Source

pub fn datetime(&self) -> DateTime<Utc>

Gets the creation time as a DateTime

§Use Cases
  • Human-readable timestamps in logs
  • Time-based filtering in UI
  • Audit reports
Source

pub fn to_lowercase(&self) -> String

Converts to lowercase string representation

§Use Cases
  • Case-insensitive systems
  • URL paths
  • Database systems that prefer lowercase
Source

pub fn validate(&self) -> Result<(), PipelineError>

Validates the pipeline ID

§Pipeline-Specific Validation
  • Must be a valid ULID
  • Must not be nil (all zeros)
  • Timestamp must be reasonable (not too far in future)
  • Additional pipeline-specific rules can be added here
Source

pub fn is_nil(&self) -> bool

Checks if this is a nil (zero) pipeline ID

§Use Cases
  • Validation in constructors
  • Default value checking
  • Debugging empty states

Trait Implementations§

Source§

impl AsRef<Ulid> for PipelineId

Source§

fn as_ref(&self) -> &Ulid

Converts this type into a shared reference of the (usually inferred) input type.
Source§

impl Clone for PipelineId

Source§

fn clone(&self) -> PipelineId

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for PipelineId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for PipelineId

Source§

fn default() -> Self

Creates a new random pipeline ID as the default

§Design Decision

We use a random ID rather than nil to prevent accidental use of uninitialized IDs in production code.

Source§

impl<'de> Deserialize<'de> for PipelineId

Source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
Source§

impl Display for PipelineId

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl From<PipelineId> for Ulid

Source§

fn from(id: PipelineId) -> Self

Converts to this type from the input type.
Source§

impl From<Ulid> for PipelineId

Source§

fn from(ulid: Ulid) -> Self

Converts to this type from the input type.
Source§

impl FromStr for PipelineId

Source§

type Err = PipelineError

The associated error which can be returned from parsing.
Source§

fn from_str(s: &str) -> Result<Self, Self::Err>

Parses a string s to return a value of this type. Read more
Source§

impl Hash for PipelineId

Source§

fn hash<__H: Hasher>(&self, state: &mut __H)

Feeds this value into the given Hasher. Read more
1.3.0 · Source§

fn hash_slice<H>(data: &[Self], state: &mut H)
where H: Hasher, Self: Sized,

Feeds a slice of this type into the given Hasher. Read more
Source§

impl Ord for PipelineId

Source§

fn cmp(&self, other: &PipelineId) -> Ordering

This method returns an Ordering between self and other. Read more
1.21.0 · Source§

fn max(self, other: Self) -> Self
where Self: Sized,

Compares and returns the maximum of two values. Read more
1.21.0 · Source§

fn min(self, other: Self) -> Self
where Self: Sized,

Compares and returns the minimum of two values. Read more
1.50.0 · Source§

fn clamp(self, min: Self, max: Self) -> Self
where Self: Sized,

Restrict a value to a certain interval. Read more
Source§

impl PartialEq for PipelineId

Source§

fn eq(&self, other: &PipelineId) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl PartialOrd for PipelineId

Source§

fn partial_cmp(&self, other: &PipelineId) -> Option<Ordering>

This method returns an ordering between self and other values if one exists. Read more
1.0.0 · Source§

fn lt(&self, other: &Rhs) -> bool

Tests less than (for self and other) and is used by the < operator. Read more
1.0.0 · Source§

fn le(&self, other: &Rhs) -> bool

Tests less than or equal to (for self and other) and is used by the <= operator. Read more
1.0.0 · Source§

fn gt(&self, other: &Rhs) -> bool

Tests greater than (for self and other) and is used by the > operator. Read more
1.0.0 · Source§

fn ge(&self, other: &Rhs) -> bool

Tests greater than or equal to (for self and other) and is used by the >= operator. Read more
Source§

impl Serialize for PipelineId

Source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more
Source§

impl Eq for PipelineId

Source§

impl StructuralPartialEq for PipelineId

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T> ToString for T
where T: Display + ?Sized,

Source§

fn to_string(&self) -> String

Converts the given value to a String. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,