@@ -7058,30 +7058,8 @@ class Schema {
70587058 RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorType);
70597059 }
70607060
7061- if (minLength_ != 0 || maxLength_ != SizeType(~0)) {
7062- SizeType count;
7063- if (internal::CountStringCodePoint<EncodingType>(str, length, &count)) {
7064- if (count < minLength_) {
7065- context.error_handler.TooShort(str, length, minLength_);
7066- RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorMinLength);
7067- }
7068- if (count > maxLength_) {
7069- context.error_handler.TooLong(str, length, maxLength_);
7070- RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorMaxLength);
7071- }
7072- }
7073- }
7074-
7075- if (pattern_ && !IsPatternMatch(pattern_, str, length)) {
7076- #ifdef RAPIDJSON_YGGDRASIL
7077- context.error_handler.DoesNotMatch(str, length,
7078- patternStr_.GetString(),
7079- patternStr_.GetStringLength());
7080- #else // RAPIDJSON_YGGDRASIL
7081- context.error_handler.DoesNotMatch(str, length);
7082- #endif // RAPIDJSON_YGGDRASIL
7083- RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorPattern);
7084- }
7061+ if (!CheckString(context, str, length))
7062+ return false;
70857063
70867064#ifdef RAPIDJSON_YGGDRASIL
70877065 if ((yggtype_ & ((1 << kYggPythonClassSchemaType) |
@@ -7121,28 +7099,50 @@ class Schema {
71217099 const ValueType v(vs->value.GetString(), vs->value.GetStringLength(),
71227100 allocator);
71237101 bool isScalar = (v == GetScalarString());
7124- if (isScalar && (yggtype_ & (1 << kYggScalarSchemaType))) {
7125- if (!(CheckSubType(context, *schema) &&
7126- CheckPrecision(context, *schema) &&
7127- CheckUnits(context, *schema) &&
7128- CheckEncoding(context, *schema))) {
7129- CLEANUP_;
7130- return false;
7102+ if (isScalar && ((yggtype_ & (1 << kYggScalarSchemaType)) ||
7103+ (type_ & (1 << kNumberSchemaType)) ||
7104+ (type_ & (1 << kIntegerSchemaType)) ||
7105+ (type_ & (1 << kStringSchemaType)))) {
7106+ unsigned int validSubtypes = 0;
7107+ if (yggtype_ & (1 << kYggScalarSchemaType))
7108+ validSubtypes = validSubtypes | subtype_;
7109+ if (type_ & (1 << kNumberSchemaType))
7110+ validSubtypes = validSubtypes | (1 << kYggFloatSchemaSubType);
7111+ if (type_ & (1 << kIntegerSchemaType))
7112+ validSubtypes = validSubtypes | (1 << kYggIntSchemaSubType);
7113+ if (type_ & (1 << kStringSchemaType))
7114+ validSubtypes = validSubtypes | (1 << kYggStringSchemaSubType);
7115+ if (!CheckSubType(context, *schema, validSubtypes)) {
7116+ CLEANUP_;
7117+ return false;
71317118 }
7132- } else if (isScalar && (type_ & (1 << kNumberSchemaType))) {
7133- if (!(CheckSubType(context, *schema, (1 << kYggFloatSchemaSubType)) &&
7134- CheckPrecision(context, *schema, SValue(8).Move()))) {
7135- CLEANUP_;
7136- return false;
7119+ if (yggtype_ & (1 << kYggScalarSchemaType)) {
7120+ if (!(CheckSubType(context, *schema, validSubtypes) &&
7121+ CheckPrecision(context, *schema) &&
7122+ CheckUnits(context, *schema) &&
7123+ CheckEncoding(context, *schema))) {
7124+ CLEANUP_;
7125+ return false;
7126+ }
71377127 }
7138- } else if (isScalar && (type_ & (1 << kIntegerSchemaType))) {
7139- if (!(CheckSubType(context, *schema, (1 << kYggIntSchemaSubType)) &&
7140- CheckPrecision(context, *schema, SValue(8).Move()))) {
7141- CLEANUP_;
7142- return false;
7128+ // if (type_ & ((1 << kNumberSchemaType) |
7129+ // (1 << kIntegerSchemaType))) {
7130+ // if (!CheckPrecision(context, *schema, SValue(8).Move())) {
7131+ // CLEANUP_;
7132+ // return false;
7133+ // }
7134+ // }
7135+ typename YggSchemaValueType::ConstMemberIterator vsub = schema->FindMember(GetSubTypeString());
7136+ if ((type_ & (1 << kStringSchemaType)) &&
7137+ vsub != schema->MemberEnd() &&
7138+ vsub->value == YggSchemaValueType::GetStringSubTypeString()) {
7139+ if (!CheckString(context, str, length)) {
7140+ CLEANUP_;
7141+ return false;
7142+ }
71437143 }
71447144 } else if (((v == Get1DArrayString()) || (v == GetNDArrayString())) &&
7145- (yggtype_ & (1 << kYggNDArraySchemaType))) {
7145+ (yggtype_ & (1 << kYggNDArraySchemaType))) {
71467146 if (!(CheckSubType(context, *schema) &&
71477147 CheckPrecision(context, *schema) &&
71487148 CheckUnits(context, *schema) &&
@@ -7185,43 +7185,12 @@ class Schema {
71857185 context.error_handler.InvalidObjWavefront(str, length);
71867186 RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorObjWavefront);
71877187 }
7188- } else if ((v == GetScalarString() || v == GetStringString()) &&
7189- (type_ & (1 << kStringSchemaType)) &&
7190- (yggtype_ == 0)) {
7191- typename YggSchemaValueType::ConstMemberIterator vsub = schema->FindMember(GetSubTypeString());
7192- if ((v == GetStringString()) ||
7193- (vsub != schema->MemberEnd() && vsub->value == YggSchemaValueType::GetStringSubTypeString())) {
7194- if (minLength_ != 0 || maxLength_ != SizeType(~0)) {
7195- SizeType count;
7196- if (internal::CountStringCodePoint<EncodingType>(str, length, &count)) {
7197- if (count < minLength_) {
7198- CLEANUP_;
7199- context.error_handler.TooShort(str, length, minLength_);
7200- RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorMinLength);
7201- }
7202- if (count > maxLength_) {
7203- CLEANUP_;
7204- context.error_handler.TooLong(str, length, maxLength_);
7205- RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorMaxLength);
7206- }
7207- }
7208- }
7209-
7210- if (pattern_ && !IsPatternMatch(pattern_, str, length)) {
7211- CLEANUP_;
7212- #ifdef RAPIDJSON_YGGDRASIL
7213- context.error_handler.DoesNotMatch(str, length,
7214- patternStr_.GetString(),
7215- patternStr_.GetStringLength());
7216- #else // RAPIDJSON_YGGDRASIL
7217- context.error_handler.DoesNotMatch(str, length);
7218- #endif // RAPIDJSON_YGGDRASIL
7219- RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorPattern);
7220- }
7221- } else {
7222- CLEANUP_;
7223- YggDisallowedType(context, v);
7224- RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorType);
7188+ } else if (v == GetStringString() &&
7189+ (type_ & (1 << kStringSchemaType)) &&
7190+ (yggtype_ == 0)) {
7191+ if (!CheckString(context, str, length)) {
7192+ CLEANUP_;
7193+ return false;
72257194 }
72267195 } else {
72277196 CLEANUP_;
@@ -8752,6 +8721,34 @@ class Schema {
87528721 return false;
87538722 return true;
87548723 }
8724+ bool CheckString(Context& context, const Ch* str, SizeType length) const {
8725+ if (minLength_ != 0 || maxLength_ != SizeType(~0)) {
8726+ SizeType count;
8727+ if (internal::CountStringCodePoint<EncodingType>(str, length, &count)) {
8728+ if (count < minLength_) {
8729+ context.error_handler.TooShort(str, length, minLength_);
8730+ RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorMinLength);
8731+ }
8732+ if (count > maxLength_) {
8733+ context.error_handler.TooLong(str, length, maxLength_);
8734+ RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorMaxLength);
8735+ }
8736+ }
8737+ }
8738+
8739+ if (pattern_ && !IsPatternMatch(pattern_, str, length)) {
8740+ #ifdef RAPIDJSON_YGGDRASIL
8741+ context.error_handler.DoesNotMatch(str, length,
8742+ patternStr_.GetString(),
8743+ patternStr_.GetStringLength());
8744+ #else // RAPIDJSON_YGGDRASIL
8745+ context.error_handler.DoesNotMatch(str, length);
8746+ #endif // RAPIDJSON_YGGDRASIL
8747+ RAPIDJSON_INVALID_KEYWORD_RETURN(kValidateErrorPattern);
8748+ }
8749+ return true;
8750+ }
8751+
87558752 bool CheckSubType(Context& context, const ValueType* subtype_str,
87568753 const bool has_encoding) const {
87578754 return CheckSubType(context, subtype_str, has_encoding, subtype_);
@@ -12755,6 +12752,10 @@ class GenericSchemaValidator :
1275512752 return false;
1275612753 MemberIter iRef = err->FindMember(GetInstanceRefString());
1275712754 MemberIter sRef = err->FindMember(GetSchemaRefString());
12755+ if (iRef == err->MemberEnd())
12756+ iRef = err->FindMember(GetSchemaIteratorRefString());
12757+ if (sRef == err->MemberEnd())
12758+ sRef = err->FindMember(GetSchemaHandlerRefString());
1275812759 if (iRef != err->MemberEnd()) {
1275912760 switch ((ValidateErrorCode)(code->value.GetInt())) {
1276012761 case kValidateErrorType:
0 commit comments