From 167bfd767f228c2351f567c5f36b270ea5c25550 Mon Sep 17 00:00:00 2001 From: Ian Beckwith Date: Thu, 23 Sep 2010 17:06:36 +0100 Subject: [PATCH] partially implement booleans --- lib/ID3FS/Path.pm | 203 +++++++++++++++++++++++---------------- lib/ID3FS/PathElement/Album.pm | 2 + lib/ID3FS/PathElement/Artist.pm | 2 + lib/ID3FS/PathElement/Boolean.pm | 2 + lib/ID3FS/PathElement/File.pm | 2 + lib/ID3FS/PathElement/Tag.pm | 2 + lib/ID3FS/PathElement/Tagval.pm | 2 + 7 files changed, 133 insertions(+), 82 deletions(-) diff --git a/lib/ID3FS/Path.pm b/lib/ID3FS/Path.pm index 7ceb45b..c76c9e6 100644 --- a/lib/ID3FS/Path.pm +++ b/lib/ID3FS/Path.pm @@ -2,6 +2,7 @@ package ID3FS::Path; use strict; use warnings; +use feature 'switch'; use ID3FS::PathElement::Artist; use ID3FS::PathElement::Album; use ID3FS::PathElement::Boolean; @@ -10,7 +11,7 @@ use ID3FS::PathElement::Tag; use ID3FS::PathElement::Tagval; our ($STATE_INVALID, $STATE_ROOT, $STATE_WANTMORE, $STATE_TAG, $STATE_TAGVAL, - $STATE_BOOL, $STATE_ARTIST, $STATE_ALBUM, $STATE_FILE)=(0..8); + $STATE_BOOLEAN, $STATE_ARTIST, $STATE_ALBUM, $STATE_FILE)=(0..8); sub new { @@ -52,11 +53,26 @@ sub dest sub dirents { my($self)=@_; - return $self->{db}->tags(@{$self->{elements}}); -# elsif($self->state() == $STATE_WANTMORE) -# { -# return(qw(AND OR ALL)); -# } + given($self->state()) + { + when($STATE_TAG) + { + return(qw(AND ARTISTS ALBUMS TRACKS)); + } + when($STATE_BOOLEAN) + { + return $self->{db}->tags(@{$self->{elements}}); + } + when($STATE_ROOT) + { + my @dents=("ALL", $self->{db}->tags(@{$self->{elements}})); + return @dents; + } + default + { + print "DIRENTS: UNHANDLED STATE: $_\n"; + } + } } sub parse @@ -74,103 +90,126 @@ sub parse while(my $name=shift @parts) { print "NAME: $name\n"; - if ($self->state() == $STATE_INVALID) - { - print "SM: INVALID: $name\n"; - return; - } - elsif($self->state() == $STATE_ROOT) + given($self->state()) { - print "SM: ROOT: $name\n"; - $tag=ID3FS::PathElement::Tag->new($self->{db}, $name); - if($tag) + when($STATE_INVALID) { - push(@{$self->{elements}}, $tag); - $self->state($STATE_WANTMORE); + print "SM: INVALID: $name\n"; + return; } - else + when($STATE_ROOT) { - $self->state($STATE_INVALID); + print "SM: ROOT: $name\n"; + if($name eq "ALL") + { + $self->state($STATE_ARTIST); + } + else + { + $tag=ID3FS::PathElement::Tag->new($self->{db}, $name); + if($tag) + { + push(@{$self->{elements}}, $tag); + $self->state($STATE_TAG); + } + else + { + $self->state($STATE_INVALID); + } + } } - } - elsif($self->state() == $STATE_WANTMORE) - { - print "SM: WANTMORE: $name\n"; - $tag=ID3FS::PathElement::Tag->new($self->{db}, $name); - if($tag) + when($STATE_TAG) { - push(@{$self->{elements}}, $tag); -# $self->state($STATE_TAG); + print "SM: TAG: $name\n"; + given($name) + { + when("AND") + { + $self->state($STATE_BOOLEAN); +# push(@{$self->{elements}}, ID3FS::PathElement::Boolean->new($name)); + } +# when("ARTISTS") { ; } +# when("ALBUMS") { ; } +# when("TRACKS") { ; } +# when("OR") { ; } +# when("NOT") { ; } + default + { + $self->state($STATE_INVALID); + } + } } - else + + when($STATE_WANTMORE) { - $self->state($STATE_INVALID); + print "SM: WANTMORE: $name\n"; + $tag=ID3FS::PathElement::Tag->new($self->{db}, $name); + if($tag) + { + push(@{$self->{elements}}, $tag); +# $self->state($STATE_TAG); + } + else + { + $self->state($STATE_INVALID); + } + my @valid_tagvals=$self->{db}->tag_values($tag); + print "TAGVALUES: $name: ", join(', ', @valid_tagvals), "\n"; + if(@valid_tagvals) + { + if(grep { $name eq $_; } @valid_tagvals) + { + print "TAGVAL VALID\n"; + $self->state($STATE_TAGVAL); + push(@{$self->{elements}}, ID3FS::PathElement::Tagval($name)); + } + else + { + print "ERROR: unknown tagval: $tagval\n"; + $self->state($STATE_INVALID); + } + } + else + { + $self->state($STATE_INVALID); + } } -# if(($name eq "AND") || ($name eq "OR")) -# { -# $self->state($STATE_BOOL); -# push(@{$self->{elements}}, ID3FS::PathElement::Boolean->new($name)); -# } -# elsif($name eq "ALL") -# { -# $self->state($STATE_ARTIST); -# } -# else -# { -# $self->state($STATE_INVALID); -# } - } - elsif($self->state() == $STATE_TAG) - { - print "SM: TAG: $name\n"; - $self->state($STATE_WANTMORE); - next; - my @valid_tagvals=$self->{db}->tag_values($tag); - print "TAGVALUES: $name: ", join(', ', @valid_tagvals), "\n"; - if(@valid_tagvals) + when($STATE_TAGVAL) + { + print "SM: TAGVAL: $name\n"; + } + when($STATE_BOOLEAN) { - if(grep { $name eq $_; } @valid_tagvals) + print "SM: BOOLEAN: $name\n"; + my $tag=ID3FS::PathElement::Tag->new($self->{db}, $name); + if($tag) { - print "TAGVAL VALID\n"; - $self->state($STATE_TAGVAL); - push(@{$self->{elements}}, ID3FS::PathElement::Tagval($name)); + push(@{$self->{elements}}, $tag); + $self->state($STATE_TAG); } else { - print "ERROR: unknown tagval: $tagval\n"; $self->state($STATE_INVALID); } } - else + when($STATE_ARTIST) + { + print "SM: ARTIST: $name\n"; + } + when($STATE_ALBUM) + { + print "SM: ALBUM: $name\n"; + } + when($STATE_FILE) { + print "SM: FILE: $name\n"; + } + default + { + print "SM: ERROR: UNKNOWN STATE: $self->{state}\n"; $self->state($STATE_INVALID); } } - elsif($self->state() == $STATE_TAGVAL) - { - print "SM: TAGVAL: $name\n"; - } - elsif($self->state() == $STATE_BOOL) - { - print "SM: BOOL: $name\n"; - } - elsif($self->state() == $STATE_ARTIST) - { - print "SM: ARTIST: $name\n"; - } - elsif($self->state() == $STATE_ALBUM) - { - print "SM: ALBUM: $name\n"; - } - elsif($self->state() == $STATE_FILE) - { - print "SM: FILE: $name\n"; - } - else - { - print "SM: ERROR: UNKNOWN STATE: $self->{state}\n"; - $self->state($STATE_INVALID); - } } } diff --git a/lib/ID3FS/PathElement/Album.pm b/lib/ID3FS/PathElement/Album.pm index 1a4b7d5..d06c458 100644 --- a/lib/ID3FS/PathElement/Album.pm +++ b/lib/ID3FS/PathElement/Album.pm @@ -15,4 +15,6 @@ sub new return $self; } +sub type { return "album"; } + 1; diff --git a/lib/ID3FS/PathElement/Artist.pm b/lib/ID3FS/PathElement/Artist.pm index 9a6c669..80f5cec 100644 --- a/lib/ID3FS/PathElement/Artist.pm +++ b/lib/ID3FS/PathElement/Artist.pm @@ -15,4 +15,6 @@ sub new return $self; } +sub type { return "artist"; } + 1; diff --git a/lib/ID3FS/PathElement/Boolean.pm b/lib/ID3FS/PathElement/Boolean.pm index 8f2f35f..baf80c6 100644 --- a/lib/ID3FS/PathElement/Boolean.pm +++ b/lib/ID3FS/PathElement/Boolean.pm @@ -15,4 +15,6 @@ sub new return $self; } +sub type { return "boolean"; } + 1; diff --git a/lib/ID3FS/PathElement/File.pm b/lib/ID3FS/PathElement/File.pm index 2ec2f3b..3071cc3 100644 --- a/lib/ID3FS/PathElement/File.pm +++ b/lib/ID3FS/PathElement/File.pm @@ -15,4 +15,6 @@ sub new return $self; } +sub type { return "file"; } + 1; diff --git a/lib/ID3FS/PathElement/Tag.pm b/lib/ID3FS/PathElement/Tag.pm index 7113b43..5020908 100644 --- a/lib/ID3FS/PathElement/Tag.pm +++ b/lib/ID3FS/PathElement/Tag.pm @@ -18,4 +18,6 @@ sub new return($self); } +sub type { return "tag"; } + 1; diff --git a/lib/ID3FS/PathElement/Tagval.pm b/lib/ID3FS/PathElement/Tagval.pm index 43c2f49..8fe059d 100644 --- a/lib/ID3FS/PathElement/Tagval.pm +++ b/lib/ID3FS/PathElement/Tagval.pm @@ -15,4 +15,6 @@ sub new return $self; } +sub type { return "tagval"; } + 1; -- 2.11.0