partially implement booleans
authorIan Beckwith <ianb@erislabs.net>
Thu, 23 Sep 2010 16:06:36 +0000 (17:06 +0100)
committerIan Beckwith <ianb@erislabs.net>
Thu, 23 Sep 2010 16:06:36 +0000 (17:06 +0100)
lib/ID3FS/Path.pm
lib/ID3FS/PathElement/Album.pm
lib/ID3FS/PathElement/Artist.pm
lib/ID3FS/PathElement/Boolean.pm
lib/ID3FS/PathElement/File.pm
lib/ID3FS/PathElement/Tag.pm
lib/ID3FS/PathElement/Tagval.pm

index 7ceb45b..c76c9e6 100644 (file)
@@ -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);
-       }
     }
 }
 
index 1a4b7d5..d06c458 100644 (file)
@@ -15,4 +15,6 @@ sub new
     return $self;
 }
 
+sub type { return "album"; }
+
 1;
index 9a6c669..80f5cec 100644 (file)
@@ -15,4 +15,6 @@ sub new
     return $self;
 }
 
+sub type { return "artist"; }
+
 1;
index 8f2f35f..baf80c6 100644 (file)
@@ -15,4 +15,6 @@ sub new
     return $self;
 }
 
+sub type { return "boolean"; }
+
 1;
index 2ec2f3b..3071cc3 100644 (file)
@@ -15,4 +15,6 @@ sub new
     return $self;
 }
 
+sub type { return "file"; }
+
 1;
index 7113b43..5020908 100644 (file)
@@ -18,4 +18,6 @@ sub new
     return($self);
 }
 
+sub type { return "tag"; }
+
 1;
index 43c2f49..8fe059d 100644 (file)
@@ -15,4 +15,6 @@ sub new
     return $self;
 }
 
+sub type { return "tagval"; }
+
 1;