Use MooseX::Types::ISO8601 coercion behaviour without the coercion.
[catagits/Gitalist.git] / lib / Gitalist / Git / Types.pm
1 package Gitalist::Git::Types;
2
3 use MooseX::Types
4      -declare => [qw/
5          SHA1
6          Dir
7          ArrayRefOfDirs
8          DirOrUndef
9      /];
10
11 use MooseX::Types::Path::Class;
12 use MooseX::Types::ISO8601 qw/ISO8601DateTimeStr/;
13 use MooseX::Types::DateTime qw/ DateTime /;
14 use MooseX::Storage::Engine ();
15 use MooseX::Types::Common::String qw/NonEmptySimpleStr/;
16 use MooseX::Types::Moose qw/ ArrayRef Undef Str /;
17 use Path::Class qw/ dir /;
18
19 subtype SHA1,
20     as NonEmptySimpleStr,
21     where { $_ =~ qr/^[0-9a-fA-F]{40}$/ },
22     message { q/Str doesn't look like a SHA1./ };
23
24 coerce SHA1,
25     from NonEmptySimpleStr,
26     via { 1 };
27
28 MooseX::Storage::Engine->add_custom_type_handler(
29     DateTime,
30         expand   => sub {
31             my $val = shift;
32             Carp::confess("Not implemented");
33         },
34         collapse => sub {
35             $_[0]->ymd('-') . 'T' . $_[0]->hms(':') . 'Z' 
36         },
37 );
38
39 subtype Dir,
40     as 'MooseX::Types::Path::Class::Dir',
41     where { 1 };
42
43 subtype ArrayRefOfDirs, as ArrayRef[Dir], where { scalar(@$_) >= 1 }, message { "Cannot find repository dir" };
44 coerce ArrayRefOfDirs, from NonEmptySimpleStr, via { [ dir($_)->resolve ] };
45 coerce ArrayRefOfDirs, from ArrayRef[NonEmptySimpleStr], via { [ map { dir($_)->resolve } @$_ ] };
46
47 subtype DirOrUndef, as Dir | Undef;
48 coerce DirOrUndef, from Str, via { if ($_) { dir($_) } else { undef }};
49
50 MooseX::Storage::Engine->add_custom_type_handler(
51     Dir,
52         expand   => sub {
53             my $val = shift;
54             Carp::confess("Not implemented");
55         },
56         collapse => sub {
57             shift() . '';
58         },
59 );
60
61 1;