#!/usr/bin/perl -w
# Usages:
-# ./farnell-find [<options>] NNN-NNNN
+# ./farnell-find [<options>] [describe] NNN-NNNN ....
# Prints info about the specified relevant part.
-# ./farnell-find [<options>] NNN-NNNN <qty> [...] <sid>|<url>
+# ./farnell-find [<options>] order [<sid>|<url>] [NNN-NNNN <qty> ...]
# Add specified parts and quantities to the cart.
-# ./farnell-find [<options>] <file> ...
+# If no parts and quantities specified on command line,
+# will read from stdin (format is <item> <qty>).
+# If no <sid> or <url> specified (ie thing with jsessionid)
+# then will prompt and read a line from tty.
+# ./farnell-find [<options>] bom <file> ...
# Processes input files and produces BOM parts list.
#
# Options:
my (@orderlist) = @_;
my ($i, $url, $item, $qty, @submit, $request, $response);
my ($page_output);
+ local ($_);
$url= "$urlbase/jsp/op/shoppingbasket.jsp;jsessionid=$jsessionid";
get_useragent();
$response= $useragent->get($url);
}
}
-if (@ARGV && $ARGV[0] =~ m/^\d\d\d\-/) {
- if (@ARGV==1) {
+sub is_jsessionid ($) {
+ my ($a) = @_;
+ return undef unless
+ $a =~ m/\;jsessionid=([0-9A-Z]+)\b/ ||
+ $a =~ m/^([0-9A-Z]+)$/;
+ return $1;
+}
+
+sub main () {
+ my ($op);
+ my ($item, $a);
+
+ die unless @ARGV;
+ $op= $ARGV[0] =~ m/^\d/ ? 'describe' : shift @ARGV;
+
+ if ($op eq 'describe') {
my ($chr, $k);
- $chr= by_item($ARGV[0]);
- dump_warnerrs();
- foreach $k (sort keys %$chr) {
- printf "%-20s %s\n", $k, $chr->{$k} or die $!;
- }
- } elsif (@ARGV > 1 && (@ARGV % 2)) {
- my (@orderlist,$item,$qty);
- $jsessionid= pop @ARGV;
- if ($jsessionid =~ m/\;jsessionid=([0-9A-Z]+)\b/) {
- $jsessionid= $1;
- } elsif ($jsessionid =~ m/^([0-9A-Z]+)$/) {
- } else {
- die "bad jsessionid\n";
+ foreach $item (@ARGV) {
+ $chr= by_item($item);
+ dump_warnerrs();
+ foreach $k (sort keys %$chr) {
+ printf "%-20s %s\n", $k, $chr->{$k} or die $!;
+ }
}
+ } elsif ($op eq 'order') {
+ my ($qty, @orderlist, $newjsid);
while (@ARGV) {
- ($item,$qty,@ARGV) = @ARGV;
- $item =~ m/^$item_re$/ or die "$item ?";
- $qty =~ m/^[1-9]\d{0,5}$/ or die "$qty ?";
- push @orderlist, $item, $qty;
+ $a= shift @ARGV;
+ if (defined($newjsid= is_jsessionid($a))) {
+ die if defined $jsessionid;
+ $jsessionid= $newjsid;
+ } elsif ($a =~ m/^$item_re$/) {
+ die unless @ARGV;
+ $qty= shift @ARGV;
+ push @orderlist, $a, $qty;
+ } else {
+ die "$a ?";
+ }
+ }
+ if (!@orderlist) {
+ for (;;) {
+ defined($_= <STDIN>) or last;
+ chomp;
+ s/^\s+//; s/\s+$//;
+ next if m/^\#/;
+ m/^($item_re)\s+(\d+)$/ or die "$_ ?";
+ push @orderlist, $1, $2;
+ }
+ die $! if STDIN->error;
+ }
+ if (!defined $jsessionid) {
+ open TTY, "+< /dev/tty" or die $!;
+ select((select(TTY), $|=1)[0]);
+ print TTY "URL or jsessionid: " or die $!;
+ $_= <TTY>; TTY->error and die $!;
+ length or die;
+ $newjsid= is_jsessionid($_);
+ defined $newjsid or die;
+ $jsessionid= $newjsid;
}
cart_add(@orderlist);
+ } elsif ($op eq 'bom') {
+ my ($filename);
+ foreach $filename (@ARGV) {
+ read_spec($filename);
+ }
+ analyse_spec();
+ exit !!@fault;
} else {
die;
}
-} elsif (@ARGV) {
- my ($filename);
- foreach $filename (@ARGV) {
- read_spec($filename);
- }
- analyse_spec();
- exit !!@fault;
-} else {
- die;
}
+
+main();