use strict;
use warnings;
+use feature 'switch';
use ID3FS::PathElement::Artist;
use ID3FS::PathElement::Album;
use ID3FS::PathElement::Boolean;
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
{
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
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);
- }
}
}