Skip to content

Commit 1f2d83f

Browse files
authored
Be more rigorous when looking for constant values (#499)
1 parent 04361c9 commit 1f2d83f

File tree

4 files changed

+504
-1347
lines changed

4 files changed

+504
-1347
lines changed

typify-impl/src/util.rs

+52-7
Original file line numberDiff line numberDiff line change
@@ -457,7 +457,7 @@ fn array_schemas_mutually_exclusive(
457457
/// otherwise return None.
458458
pub(crate) fn constant_string_value(schema: &Schema) -> Option<&str> {
459459
match schema {
460-
// Strings must be simple enumerations.
460+
// Singleton, typed enumerated value.
461461
Schema::Object(SchemaObject {
462462
metadata: _,
463463
instance_type: Some(SingleOrVec::Single(single)),
@@ -471,13 +471,58 @@ pub(crate) fn constant_string_value(schema: &Schema) -> Option<&str> {
471471
object: None,
472472
reference: None,
473473
extensions: _,
474-
}) if single.as_ref() == &InstanceType::String => {
475-
if values.len() == 1 {
476-
values.get(0).and_then(|value| value.as_str())
477-
} else {
478-
None
479-
}
474+
}) if single.as_ref() == &InstanceType::String && values.len() == 1 => {
475+
values.first().unwrap().as_str()
480476
}
477+
478+
// Singleton, untyped enumerated value.
479+
Schema::Object(SchemaObject {
480+
metadata: _,
481+
instance_type: None,
482+
format: None,
483+
enum_values: Some(values),
484+
const_value: None,
485+
subschemas: None,
486+
number: None,
487+
string: None,
488+
array: None,
489+
object: None,
490+
reference: None,
491+
extensions: _,
492+
}) if values.len() == 1 => values.first().unwrap().as_str(),
493+
494+
// Constant value.
495+
Schema::Object(SchemaObject {
496+
metadata: _,
497+
instance_type: Some(SingleOrVec::Single(single)),
498+
format: None,
499+
enum_values: None,
500+
const_value: Some(value),
501+
subschemas: None,
502+
number: None,
503+
string: None,
504+
array: None,
505+
object: None,
506+
reference: None,
507+
extensions: _,
508+
}) if single.as_ref() == &InstanceType::String => value.as_str(),
509+
510+
// Constant, untyped value.
511+
Schema::Object(SchemaObject {
512+
metadata: _,
513+
instance_type: None,
514+
format: None,
515+
enum_values: None,
516+
const_value: Some(value),
517+
subschemas: None,
518+
number: None,
519+
string: None,
520+
array: None,
521+
object: None,
522+
reference: None,
523+
extensions: _,
524+
}) => value.as_str(),
525+
481526
_ => None,
482527
}
483528
}

0 commit comments

Comments
 (0)