]> git.cworth.org Git - sup/blob - lib/sup/modes/console-mode.rb
console: index internals accessor
[sup] / lib / sup / modes / console-mode.rb
1 require 'pp'
2
3 module Redwood
4
5 class Console
6   def initialize mode
7     @mode = mode
8   end
9
10   def query(query)
11     Enumerable::Enumerator.new(Index, :each_message, Index.parse_query(query))
12   end
13
14   def add_labels(query, *labels)
15     query(query).each { |m| m.labels += labels; m.save Index }
16   end
17
18   def remove_labels(query, *labels)
19     query(query).each { |m| m.labels -= labels; m.save Index }
20   end
21
22   def xapian; Index.instance.instance_variable_get :@xapian; end
23   def ferret; Index.instance.instance_variable_get :@index; end
24 end
25
26 class ConsoleMode < LogMode
27   def initialize
28     super
29     @binding = Console.new(self).instance_eval { binding }
30   end
31
32   def execute cmd
33     begin
34       self << ">> #{cmd}\n"
35       ret = eval cmd, @binding
36       self << "=> #{ret.pretty_inspect}\n"
37     rescue Exception
38       self << "#{$!.class}: #{$!.message}\n"
39       clean_backtrace = []
40       $!.backtrace.each { |l| break if l =~ /console-mode/; clean_backtrace << l }
41       clean_backtrace.each { |l| self << "#{l}\n" }
42     end
43   end
44
45   def prompt
46     BufferManager.ask :console, "eval: "
47   end
48
49   def run
50     while true
51       cmd = prompt or return
52       execute cmd
53     end
54   end
55 end
56
57 end