pub enum SlugError {
IdTooLong {
input: String,
length: usize,
max: usize,
},
TitleEmpty {
input: String,
},
TitleHasInvalidChars {
input: String,
invalid_chars: Vec<char>,
proposed_slug: String,
},
TitleHasControlChars {
input: String,
control_chars: Vec<char>,
proposed_slug: String,
},
}Expand description
Error cases for title→slug derivation. title_to_slug itself is
total — any title produces a slug (residual cases like
all-emoji collapse to a deterministic short-hash id) — so it never
returns these variants directly. The strict mutation-entry gate
validate_and_derive_slug returns them when the input would have
fallen back to the hash slug or would have had characters dropped;
enforce_id_length returns Self::IdTooLong when the
derived mem--slug exceeds the read-path length cap.
Loader and parse paths continue to call title_to_slug so
pre-gate entities created with the old permissive pipeline remain
readable.
Variants§
IdTooLong
The derived mem--slug id exceeds ENTITY_ID_MAX_LEN. The
read-path validator rejects ids past this length, so without
this guard a title that the write path accepts produces an
entity that is silently unreachable on read.
The bound is on the composed id (<mem>--<slug>), which is
also the on-disk filename — so the budget is mem-name-dependent
and the same title can be valid in a short-named mem and rejected
in a longer-named one. input echoes that composed id (not the
title) so it agrees with length: the payload measures one
quantity, the id, end to end. max is ENTITY_ID_MAX_LEN so the
agent can shorten by the exact delta. F2 + F4.
Fields
TitleEmpty
Strict mutation-entry rejection: the title is empty, whitespace-only, or composed exclusively of pipeline-separator characters (hyphens) so the slug pipeline would have collapsed it to a hash-fallback id. Recovery: supply a non-empty title with at least one alphanumeric character. F4.
TitleHasInvalidChars
Strict mutation-entry rejection: one or more characters in the
title would have been dropped by the slug pipeline (anything
that isn’t Unicode alphanumeric, whitespace, or hyphen after
NFC + case-fold). invalid_chars lists each distinct offending
character in source order; proposed_slug is the slug the
permissive pipeline would have produced, suitable for a
mechanical retry against a sanitised title. F10 + F19.
TitleHasControlChars
Strict mutation-entry rejection: the title contains control
characters (newline, tab, other C0/C1 controls). These are
Unicode whitespace, so the slug pipeline silently folds them to
hyphens and accepts the title — but they survive verbatim into the
stored # H1 heading, which then splits across lines so every
read truncates the title at the first control char (search and
memstead_entity see only the prefix). Refused up front with the same
named-offenders + proposed_slug recovery shape the invalid-char
guard uses. control_chars lists each distinct offender in source
order; proposed_slug is the slug the pipeline would produce, for
a mechanical retry with a single-line title. F8.
Implementations§
Trait Implementations§
Source§impl Error for SlugError
impl Error for SlugError
1.30.0 · Source§fn source(&self) -> Option<&(dyn Error + 'static)>
fn source(&self) -> Option<&(dyn Error + 'static)>
1.0.0 · Source§fn description(&self) -> &str
fn description(&self) -> &str
use the Display impl or to_string()
Auto Trait Implementations§
impl Freeze for SlugError
impl RefUnwindSafe for SlugError
impl Send for SlugError
impl Sync for SlugError
impl Unpin for SlugError
impl UnsafeUnpin for SlugError
impl UnwindSafe for SlugError
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be
downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further
downcast into Rc<ConcreteType> where ConcreteType implements Trait.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &Any’s vtable from &Trait’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> ErrorExt for T
impl<T> ErrorExt for T
impl<T> Fruit for T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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