The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package App::wmiirc::Util;
{
  $App::wmiirc::Util::VERSION = '1.000';
}
# ABSTRACT: Various utilities for wmii
use strictures 1;
use parent 'Exporter';
use IPC::Open2;

our @EXPORT = qw(config wmiir wimenu);

our @CONFDIRS = split /:/, $ENV{WMII_CONFPATH} || "$ENV{HOME}/.wmii";

# TODO: This should use ixp (via Lib::IXP?)

sub wmiir {
  my($file, @args) = @_;

  my $action = do {
    if(@args) {
      if(not defined $args[0]) {
        "remove"
      } else {
        "create"
      }
    } else {
      "read"
    }
  };

  if($action eq 'create') {
    # TODO: hacky, maybe do need create as an explicit thing, but I quite like
    # not having the distinction.
    system "wmiir", "ls", $file or ($action = "write");
    open my $fh, "|-", "wmiir", $action, $file  or die $!;
    print $fh join("\n", @args), "\n" or return 0;
    close $fh or return 0;
    return !$?;
  } else {
    $action = "ls" if $action eq 'read' and $file =~ m{/$};
    my @items = qx{wmiir $action $file};
    chomp @items;
    return wantarray ? @items : $items[0];
  }
}

sub config {
  my($name, $defaults, $part) = @_;

  for my $dir(@CONFDIRS) {
    if(-r "$dir/$name") {
      open my $fh, "<", "$dir/$name" or return;
      if(defined $defaults and not ref $defaults) {
        return {_parse($fh)}->{$defaults} || $part;
      } elsif(wantarray) {
        return %$defaults, _parse($fh);
      } else {
        return join "", <$fh>;
      }
    }
  }
  return wantarray ? %$defaults : !ref($defaults) ? $part : $defaults;
}

sub _parse {
  my($fh) = @_;
  my %o;
  while(<$fh>) {
    chomp;
    next if /^\s*#/;
    my($k, $v) = $_ =~ /^\s*(\S+)(?:\s+(.*)|\s*$)/;
    $o{$k} = $v;
  }
  return %o;
}

# TODO: async API, maybe completion support?
sub wimenu {
  my(@items) = @_;
  my %opts;
  if(@items && ref $items[0] eq 'HASH') {
    %opts = %{shift @items};
    if(my $name = delete $opts{name}) {
      $opts{p} = $name;
      $opts{h} = "$CONFDIRS[0]/history." . (delete $opts{history} || $name);
      $opts{n} = delete $opts{num} || 5000;
    }
  }
  my $pid = open2 my($out_fh, $in_fh), "wimenu",
    map +("-$_" => $opts{$_}), keys %opts;
  print $in_fh join("\n",
    @items && ref $items[0] eq 'ARRAY' ? @{$items[0]} : @items), "\n";
  close $in_fh;
  waitpid $pid, 0;
  (<$out_fh> =~ /(.*)/)[0];
}

1;

__END__
=pod

=head1 NAME

App::wmiirc::Util - Various utilities for wmii

=head1 VERSION

version 1.000

=head1 AUTHOR

David Leadbeater <dgl@dgl.cx>

=head1 COPYRIGHT AND LICENSE

This software is copyright (c) 2012 by David Leadbeater.

This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.

=cut