Toby Inkster avatar Toby Inkster committed 429900c

assertion facet

Comments (0)

Files changed (1)

 }
 
 our @patterns;   my $pattern_i = -1;
+our @assertions; my $assertion_i = -1;
 my %facets = (
+	assertion => sub {
+		my ($o, $var) = @_;
+		return unless exists $o->{assertion};
+		my $ass = delete $o->{assertion};
+		$ass = [$ass] unless ref($ass) eq q(ARRAY);
+		my @r;
+		for my $a (@$ass)
+		{
+			require Types::TypeTiny;
+			if (Types::TypeTiny::CodeLike->check($a))
+			{
+				$assertion_i++;
+				$assertions[$assertion_i] = $a;
+				push @r, sprintf('$Types::XSD::assertions[%d]->(%s)', $assertion_i, $var);
+			}
+			elsif (Types::TypeTiny::StringLike->check($a))
+			{
+				push @r, ($var eq '$_') ? "do { $a }" : "do { local $_ = $var; $a }";
+			}
+			else
+			{
+				croak "assertions should be strings or coderefs";
+			}
+		}
+		join ' && ', map "($_)", @r;
+	},
 	length => sub {
 		my ($o, $var) = @_;
 		return unless exists $o->{length};
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.