Skip to content

Commit fedac0f

Browse files
committed
fix up parsing before work
1 parent e8b7ce1 commit fedac0f

File tree

2 files changed

+27
-14
lines changed

2 files changed

+27
-14
lines changed

src/input/input_abstract.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use super::datetime::{EitherDate, EitherDateTime, EitherTime, EitherTimedelta};
1010
use super::return_enums::{EitherBytes, EitherString};
1111
use super::{GenericArguments, GenericCollection, GenericIterator, GenericMapping, JsonInput};
1212

13+
#[derive(Debug)]
1314
pub enum InputType {
1415
Python,
1516
Json,

src/validators/uuid.rs

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use pyo3::types::PyDict;
44

55
use uuid::Uuid;
66

7-
use crate::build_tools::SchemaDict;
7+
use crate::build_tools::{is_strict, SchemaDict};
88
use crate::errors::{ErrorType, ValError, ValResult};
99
use crate::input::Input;
1010
use crate::recursion_guard::RecursionGuard;
@@ -15,6 +15,7 @@ use super::{BuildValidator, CombinedValidator, Definitions, DefinitionsBuilder,
1515
#[derive(Debug, Clone)]
1616
#[allow(dead_code)]
1717
pub struct UuidValidator {
18+
strict: bool,
1819
version: Option<usize>,
1920
}
2021

@@ -23,10 +24,11 @@ impl BuildValidator for UuidValidator {
2324

2425
fn build(
2526
schema: &PyDict,
26-
_config: Option<&PyDict>,
27+
config: Option<&PyDict>,
2728
_definitions: &mut DefinitionsBuilder<CombinedValidator>,
2829
) -> PyResult<CombinedValidator> {
2930
Ok(Self {
31+
strict: is_strict(schema, config)?,
3032
version: schema.get_as(intern!(schema.py(), "version"))?,
3133
}
3234
.into())
@@ -38,14 +40,12 @@ impl Validator for UuidValidator {
3840
&'s self,
3941
py: Python<'data>,
4042
input: &'data impl Input<'data>,
41-
_extra: &Extra,
43+
extra: &Extra,
4244
_definitions: &'data Definitions<CombinedValidator>,
4345
_recursion_guard: &'s mut RecursionGuard,
4446
) -> ValResult<'data, PyObject> {
45-
match self.get_uuid(input) {
46-
Ok(lib_uuid) => Ok(PyUuid::new(lib_uuid).into_py(py)),
47-
Err(error_type) => Err(error_type),
48-
}
47+
let lib_uuid = self.get_uuid(input, extra.strict.unwrap_or(self.strict))?;
48+
Ok(PyUuid::new(lib_uuid).into_py(py))
4949
}
5050

5151
fn different_strict_behavior(
@@ -67,13 +67,25 @@ impl Validator for UuidValidator {
6767

6868
#[allow(dead_code)]
6969
impl UuidValidator {
70-
fn get_uuid<'s, 'data>(&'s self, input: &'data impl Input<'data>) -> ValResult<'data, Uuid> {
71-
if let Some(py_uuid) = input.input_as_uuid() {
72-
let lib_uuid = py_uuid.into_uuid();
73-
self.check_version(input, lib_uuid)?;
74-
Ok(lib_uuid)
75-
} else {
76-
Err(ValError::new(ErrorType::UuidType, input))
70+
fn get_uuid<'s, 'data>(&'s self, input: &'data impl Input<'data>, strict: bool) -> ValResult<'data, Uuid> {
71+
match input.validate_str(strict) {
72+
Ok(either_uuid) => {
73+
let cow = either_uuid.as_cow()?;
74+
let uuid_str = cow.as_ref();
75+
match Uuid::parse_str(uuid_str) {
76+
Ok(lib_uuid) => Ok(lib_uuid),
77+
Err(e) => Err(ValError::new(ErrorType::UuidParsing { error: e.to_string() }, input)),
78+
}
79+
}
80+
Err(_) => {
81+
if let Some(py_uuid) = input.input_as_uuid() {
82+
let lib_uuid = py_uuid.into_uuid();
83+
self.check_version(input, lib_uuid)?;
84+
Ok(lib_uuid)
85+
} else {
86+
Err(ValError::new(ErrorType::UuidType, input))
87+
}
88+
}
7789
}
7890
}
7991

0 commit comments

Comments
 (0)