message: Added segmentid_from_string
diff: @@ -4,6 +4,8 @@ use uuid::Uuid;
  #[cfg(test)]
  use once_cell::sync::Lazy;
  +use std::error::Error;
  +use std::str::FromStr;
  #[cfg(test)]
  use std::sync::atomic;
  @@ -52,15 +54,51 @@ impl SegmentId {
  /// and the rest is random.
  ///
  /// Picking the first 8 chars is ok to identify
  - /// segments in a display message.
  + /// segments in a display message (e.g. a5c4dfcb).
  pub fn short_uuid_string(&self) -> String {
  (&self.0.to_simple_ref().to_string()[..8]).to_string()
  }
  /// Returns a segment uuid string.
  + ///
  + /// It consists in 32 lowercase hexadecimal chars
  + /// (e.g. a5c4dfcbdfe645089129e308e26d5523)
  pub fn uuid_string(&self) -> String {
  self.0.to_simple_ref().to_string()
  }
  +
  + /// Build a `SegmentId` string from the full uuid string.
  + ///
  + /// E.g. "a5c4dfcbdfe645089129e308e26d5523"
  + pub fn from_uuid_string(uuid_string: &str) -> Result<SegmentId, SegmentIdParseError> {
  + FromStr::from_str(uuid_string)
  + }
  +}
  +
  +/// Error type used when parsing a `SegmentId` from a string fails.
  +pub struct SegmentIdParseError(uuid::parser::ParseError);
  +
  +impl Error for SegmentIdParseError {}
  +
  +impl fmt::Debug for SegmentIdParseError {
  + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
  + self.0.fmt(f)
  + }
  +}
  +
  +impl fmt::Display for SegmentIdParseError {
  + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
  + self.0.fmt(f)
  + }
  +}
  +
  +impl FromStr for SegmentId {
  + type Err = SegmentIdParseError;
  +
  + fn from_str(uuid_string: &str) -> Result<Self, SegmentIdParseError> {
  + let uuid = Uuid::parse_str(uuid_string).map_err(SegmentIdParseError)?;
  + Ok(SegmentId(uuid))
  + }
  }
  impl fmt::Debug for SegmentId {
  @@ -80,3 +118,18 @@ impl Ord for SegmentId {
  self.0.as_bytes().cmp(other.0.as_bytes())
  }
  }
  +
  +#[cfg(test)]
  +mod tests {
  + use super::SegmentId;
  +
  + #[test]
  + fn test_to_uuid_string() {
  + let full_uuid = "a5c4dfcbdfe645089129e308e26d5523";
  + let segment_id = SegmentId::from_uuid_string(full_uuid).unwrap();
  + assert_eq!(segment_id.uuid_string(), full_uuid);
  + assert_eq!(segment_id.short_uuid_string(), "a5c4dfcb");
  + // one extra char
  + assert!(SegmentId::from_uuid_string("a5c4dfcbdfe645089129e308e26d5523b").is_err());
  + }
  +}
  