Refactor rpn2perl() to clarify structure.
[simpleserver-moved-to-github.git] / samples / render-search.pl
1 #!/usr/bin/perl -w
2
3 # $Header: /home/cvsroot/simpleserver/samples/render-search.pl,v 1.2 2002-03-05 12:03:26 mike Exp $
4 #
5 # Trivial example of programming using the "augmented classes"
6 # paradigm.  This tiny SimpleServer-based Z39.50 server logs Type-1
7 # searches in human-readable form.  It works by augmenting existing
8 # classes (the RPN-node types) with additional methods -- something
9 # that most OO languages would definitely not allow, but Perl does.
10 # And it's sort of cute.
11
12 use Net::Z3950::SimpleServer;
13 use strict;
14
15 my $handler = Net::Z3950::SimpleServer->new(SEARCH => \&search_handler,
16                                             FETCH => \&fetch_handler);
17 $handler->launch_server("render-search.pl", @ARGV);
18
19 sub search_handler {
20     my($args) = @_;
21     print "got search: ", $args->{RPN}->{query}->render(), "\n";
22 }
23
24 sub fetch_handler {} # no-op
25
26
27 package Net::Z3950::RPN::Term;
28 sub render {
29     my $self = shift;
30     return '"' . $self->{term} . '"';
31 }
32
33 package Net::Z3950::RPN::And;
34 sub render {
35     my $self = shift;
36     return '(' . $self->[0]->render() . ' AND ' .
37                  $self->[1]->render() . ')';
38 }
39
40 package Net::Z3950::RPN::Or;
41 sub render {
42     my $self = shift;
43     return '(' . $self->[0]->render() . ' OR ' .
44                  $self->[1]->render() . ')';
45 }
46
47 package Net::Z3950::RPN::AndNot;
48 sub render {
49     my $self = shift;
50     return '(' . $self->[0]->render() . ' ANDNOT ' .
51                  $self->[1]->render() . ')';
52 }