Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added Match.Maybe to allow optional matching with null support #6220

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
6 changes: 5 additions & 1 deletion docs/client/full-api/api/check.md
Expand Up @@ -111,6 +111,10 @@ only if the key is not set as opposed to the value being set to `undefined`.

{{/dtdd}}

{{#dtdd "<code>Match.Maybe(<em>pattern</em>)</code>"}} Behaves like `Match.Optional`
except it also matches `null`. If used in an object, the behaviour is identical to `Match.optional`.
{{/dtdd}}

{{#dtdd "<code>Match.OneOf(<em>pattern1</em>, <em>pattern2</em>, ...)</code>"}}
Matches any value that matches at least one of the provided patterns.
{{/dtdd}}
Expand All @@ -135,4 +139,4 @@ from the call to `check` or `Match.test`. Examples:
{{/dtdd}}
</dl>

{{/template}}
{{/template}}
15 changes: 12 additions & 3 deletions packages/check/match.js
Expand Up @@ -47,6 +47,9 @@ Match = {
Optional: function (pattern) {
return new Optional(pattern);
},
Maybe: function (pattern) {
return new Maybe(pattern);
},
OneOf: function (/*arguments*/) {
return new OneOf(_.toArray(arguments));
},
Expand Down Expand Up @@ -112,6 +115,8 @@ var Optional = function (pattern) {
this.pattern = pattern;
};

var Maybe = Optional;

var OneOf = function (choices) {
if (_.isEmpty(choices))
throw new Error("Must provide at least one choice to Match.OneOf");
Expand Down Expand Up @@ -245,8 +250,12 @@ var testSubtree = function (value, pattern) {
}


if (pattern instanceof Optional)
if (pattern instanceof Maybe) {
pattern = Match.OneOf(undefined, null, pattern.pattern);
}
else if (pattern instanceof Optional) {
pattern = Match.OneOf(undefined, pattern.pattern);
}

if (pattern instanceof OneOf) {
for (var i = 0; i < pattern.choices.length; ++i) {
Expand All @@ -259,7 +268,7 @@ var testSubtree = function (value, pattern) {
}
// XXX this error is terrible
return {
message: "Failed Match.OneOf or Match.Optional validation",
message: "Failed Match.OneOf, Match.Maybe or Match.Optional validation",
path: ""
};
}
Expand Down Expand Up @@ -319,7 +328,7 @@ var testSubtree = function (value, pattern) {
var requiredPatterns = {};
var optionalPatterns = {};
_.each(pattern, function (subPattern, key) {
if (subPattern instanceof Optional)
if (subPattern instanceof Optional || subPattern instanceof Maybe)
optionalPatterns[key] = subPattern.pattern;
else
requiredPatterns[key] = subPattern;
Expand Down
10 changes: 10 additions & 0 deletions packages/check/match_test.js
Expand Up @@ -41,6 +41,9 @@ Tinytest.add("check - check", function (test) {
matches(pair[0], type);
matches(pair[0], Match.Optional(type));
matches(undefined, Match.Optional(type));
matches(pair[0], Match.Maybe(type));
matches(undefined, Match.Maybe(type));
matches(null, Match.Maybe(type));
matches(pair[0], Match.Where(function () {
check(pair[0], type);
return true;
Expand Down Expand Up @@ -98,9 +101,16 @@ Tinytest.add("check - check", function (test) {
matches({}, {a: Match.Optional(Number)});
matches({a: 1}, {a: Match.Optional(Number)});
fails({a: true}, {a: Match.Optional(Number)});
matches({}, {a: Match.Maybe(Number)});
matches({a: 1}, {a: Match.Maybe(Number)});
fails({a: true}, {a: Match.Maybe(Number)});
// Match.Optional means "or undefined" at the top level but "or absent" in
// objects.
fails({a: undefined}, {a: Match.Optional(Number)});
// Match.Maybe should behave the same as Match.Optional in objects
// including handling nulls
fails({a: undefined}, {a: Match.Maybe(Number)});
fails({a: null}, {a: Match.Maybe(Number)});
var F = function () {
this.x = 123;
};
Expand Down