pub struct ValidatorRegistry { /* private fields */ }Expand description
A deterministic local registry containing one definition per stable ID.
§Examples
use qubit_validator::ValidatorRegistry;
let registry = ValidatorRegistry::empty();
assert!(registry.registrations().is_empty());
assert!(registry.get("example.unknown").is_none());Implementations§
Source§impl ValidatorRegistry
impl ValidatorRegistry
Sourcepub fn from_registrations<I>(
registrations: I,
) -> Result<Self, ValidatorRegistryError>
pub fn from_registrations<I>( registrations: I, ) -> Result<Self, ValidatorRegistryError>
Builds a registry by taking ownership of registration values.
§Type Parameters
I- An iterable whose items can be converted into registrations.
§Parameters
registrations- Values to validate and store in the registry.
§Errors
Returns every source which declared a duplicated stable ID, or the identifier and cause of the first invalid descriptor.
§Returns
Returns a registry containing the validated registrations sorted by ID.
Examples found in repository?
150fn main() -> Result<(), Box<dyn Error>> {
151 let registration = ValidatorRegistration::new(
152 ValidatorId::new("text.non_blank"),
153 &DESCRIPTOR,
154 RegistrationSource::new(env!("CARGO_PKG_NAME"), module_path!(), file!(), line!()),
155 );
156 let registry = ValidatorRegistry::from_registrations([registration])?;
157
158 assert!(registry.get("text.non_blank").is_some());
159 let validator = registry.bind("text.non_blank", InputType::Text, &[])?;
160 let context = BoundValidationContext::new(&[]);
161
162 let valid = validator.validate(ValidationValue::Text("Ada"), &context)?;
163 assert_eq!(valid, ValidationOutcome::Valid);
164
165 let invalid = validator.validate(ValidationValue::Text(" "), &context)?;
166 let ValidationOutcome::Invalid(violations) = invalid else {
167 panic!("blank text must be invalid");
168 };
169 assert_eq!(violations.len(), 1);
170 assert_eq!(violations[0].code(), ViolationCode::new("text.blank"));
171
172 assert_dependency_specs_come_from_signature()?;
173 assert_parameters_are_consumed_once()?;
174
175 #[cfg(feature = "inventory")]
176 {
177 let global = ValidatorRegistry::try_global()?;
178 assert!(global.get("text.non_blank.global").is_some());
179 }
180
181 Ok(())
182}Sourcepub fn try_global() -> Result<&'static Self, ValidatorRegistryError>
pub fn try_global() -> Result<&'static Self, ValidatorRegistryError>
Initializes and returns the process-wide inventory registry.
§Errors
Returns the cached error when linked registrations contain a duplicate
ID or an invalid descriptor. This method is available only with the
inventory feature.
§Returns
Returns the process-wide registry when initialization succeeds.
Examples found in repository?
150fn main() -> Result<(), Box<dyn Error>> {
151 let registration = ValidatorRegistration::new(
152 ValidatorId::new("text.non_blank"),
153 &DESCRIPTOR,
154 RegistrationSource::new(env!("CARGO_PKG_NAME"), module_path!(), file!(), line!()),
155 );
156 let registry = ValidatorRegistry::from_registrations([registration])?;
157
158 assert!(registry.get("text.non_blank").is_some());
159 let validator = registry.bind("text.non_blank", InputType::Text, &[])?;
160 let context = BoundValidationContext::new(&[]);
161
162 let valid = validator.validate(ValidationValue::Text("Ada"), &context)?;
163 assert_eq!(valid, ValidationOutcome::Valid);
164
165 let invalid = validator.validate(ValidationValue::Text(" "), &context)?;
166 let ValidationOutcome::Invalid(violations) = invalid else {
167 panic!("blank text must be invalid");
168 };
169 assert_eq!(violations.len(), 1);
170 assert_eq!(violations[0].code(), ViolationCode::new("text.blank"));
171
172 assert_dependency_specs_come_from_signature()?;
173 assert_parameters_are_consumed_once()?;
174
175 #[cfg(feature = "inventory")]
176 {
177 let global = ValidatorRegistry::try_global()?;
178 assert!(global.get("text.non_blank.global").is_some());
179 }
180
181 Ok(())
182}Sourcepub fn get(&self, id: &str) -> Option<&ValidatorRegistration>
pub fn get(&self, id: &str) -> Option<&ValidatorRegistration>
Finds a registration by stable ID.
§Returns
Returns Some for a registered ID and None when the ID is unknown.
Examples found in repository?
150fn main() -> Result<(), Box<dyn Error>> {
151 let registration = ValidatorRegistration::new(
152 ValidatorId::new("text.non_blank"),
153 &DESCRIPTOR,
154 RegistrationSource::new(env!("CARGO_PKG_NAME"), module_path!(), file!(), line!()),
155 );
156 let registry = ValidatorRegistry::from_registrations([registration])?;
157
158 assert!(registry.get("text.non_blank").is_some());
159 let validator = registry.bind("text.non_blank", InputType::Text, &[])?;
160 let context = BoundValidationContext::new(&[]);
161
162 let valid = validator.validate(ValidationValue::Text("Ada"), &context)?;
163 assert_eq!(valid, ValidationOutcome::Valid);
164
165 let invalid = validator.validate(ValidationValue::Text(" "), &context)?;
166 let ValidationOutcome::Invalid(violations) = invalid else {
167 panic!("blank text must be invalid");
168 };
169 assert_eq!(violations.len(), 1);
170 assert_eq!(violations[0].code(), ViolationCode::new("text.blank"));
171
172 assert_dependency_specs_come_from_signature()?;
173 assert_parameters_are_consumed_once()?;
174
175 #[cfg(feature = "inventory")]
176 {
177 let global = ValidatorRegistry::try_global()?;
178 assert!(global.get("text.non_blank.global").is_some());
179 }
180
181 Ok(())
182}Sourcepub fn registrations(&self) -> &[ValidatorRegistration]
pub fn registrations(&self) -> &[ValidatorRegistration]
Returns registrations sorted by stable ID.
§Returns
Returns a borrowed slice of all registrations in stable-ID order.
Sourcepub fn bind(
&self,
id: &str,
input: InputType,
params: &[NamedValidationArgument<'_>],
) -> Result<BoundValidator, BindError>
pub fn bind( &self, id: &str, input: InputType, params: &[NamedValidationArgument<'_>], ) -> Result<BoundValidator, BindError>
Binds a rule by ID and input shape.
§Parameters
id- Stable identifier of the registered rule to bind.input- Input shape that the bound rule must accept.params- Named arguments supplied to the rule.
§Errors
Returns MissingRule when id has no registration. This error has
no resolved rule ID; callers that need the requested text retain id.
Signature and preparation errors for a found rule carry its ID.
§Returns
Returns the bound validator when the registration exists and accepts the supplied input and parameters.
Examples found in repository?
150fn main() -> Result<(), Box<dyn Error>> {
151 let registration = ValidatorRegistration::new(
152 ValidatorId::new("text.non_blank"),
153 &DESCRIPTOR,
154 RegistrationSource::new(env!("CARGO_PKG_NAME"), module_path!(), file!(), line!()),
155 );
156 let registry = ValidatorRegistry::from_registrations([registration])?;
157
158 assert!(registry.get("text.non_blank").is_some());
159 let validator = registry.bind("text.non_blank", InputType::Text, &[])?;
160 let context = BoundValidationContext::new(&[]);
161
162 let valid = validator.validate(ValidationValue::Text("Ada"), &context)?;
163 assert_eq!(valid, ValidationOutcome::Valid);
164
165 let invalid = validator.validate(ValidationValue::Text(" "), &context)?;
166 let ValidationOutcome::Invalid(violations) = invalid else {
167 panic!("blank text must be invalid");
168 };
169 assert_eq!(violations.len(), 1);
170 assert_eq!(violations[0].code(), ViolationCode::new("text.blank"));
171
172 assert_dependency_specs_come_from_signature()?;
173 assert_parameters_are_consumed_once()?;
174
175 #[cfg(feature = "inventory")]
176 {
177 let global = ValidatorRegistry::try_global()?;
178 assert!(global.get("text.non_blank.global").is_some());
179 }
180
181 Ok(())
182}