protify 0.1.4

A Rust-first protobuf framework to generate packages from rust code, with validation included
Documentation
#[doc(hidden)]
pub mod state;
use crate::validators::*;
pub(crate) use state::*;

/// Builder for [`MessageValidator`].
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct MessageValidatorBuilder<S: State = Empty> {
	_state: PhantomData<S>,

	data: MessageValidator,
}

impl<S: State> Default for MessageValidatorBuilder<S> {
	#[inline]
	fn default() -> Self {
		Self {
			_state: PhantomData,
			data: MessageValidator::default(),
		}
	}
}

impl MessageValidator {
	#[must_use]
	#[inline]
	pub fn builder() -> MessageValidatorBuilder {
		MessageValidatorBuilder::default()
	}
}

impl<S: State> From<MessageValidatorBuilder<S>> for ProtoOption {
	#[inline(never)]
	#[cold]
	fn from(value: MessageValidatorBuilder<S>) -> Self {
		value.build().into()
	}
}

#[allow(
	clippy::must_use_candidate,
	clippy::use_self,
	clippy::return_self_not_must_use
)]
impl<S: State> MessageValidatorBuilder<S> {
	/// Adds a [`CelProgram`] to this validator.
	#[inline]
	pub fn cel(mut self, program: CelProgram) -> MessageValidatorBuilder<S> {
		self.data.cel.push(program);

		MessageValidatorBuilder {
			_state: PhantomData,
			data: self.data,
		}
	}

	/// Specifies that this validator should always be ignored.
	#[inline]
	pub fn ignore_always(mut self) -> MessageValidatorBuilder<SetIgnore<S>>
	where
		S::Ignore: IsUnset,
	{
		self.data.ignore = Ignore::Always;

		MessageValidatorBuilder {
			_state: PhantomData,
			data: self.data,
		}
	}

	/// Specifies that the field must be set in order to be valid.
	#[inline]
	pub fn required(mut self) -> MessageValidatorBuilder<SetRequired<S>>
	where
		S::Required: IsUnset,
	{
		self.data.required = true;

		MessageValidatorBuilder {
			_state: PhantomData,
			data: self.data,
		}
	}

	/// Specifies a custom error message to display for the `required` violation.
	#[inline]
	pub fn required_error_message(
		mut self,
		msg: impl Into<FixedStr>,
	) -> MessageValidatorBuilder<SetRequiredErrorMessage<S>>
	where
		S::RequiredErrorMessage: IsUnset,
		S::Required: IsSet,
	{
		self.data.required_error_message = Some(msg.into());

		MessageValidatorBuilder {
			_state: PhantomData,
			data: self.data,
		}
	}

	/// Builds the validator.
	#[inline]
	pub fn build(self) -> MessageValidator {
		self.data
	}
}