File Coverage

blib/lib/Rosetta/Shell.pm
Criterion Covered Total %
statement 13 15 86.6
branch n/a
condition n/a
subroutine 5 5 100.0
pod n/a
total 18 20 90.0


line stmt bran cond sub pod time code
1             #!perl
2 1     1   2814 use 5.008001;
  1         3  
  1         38  
3 1     1   6 use utf8;
  1         2  
  1         5  
4 1     1   20 use strict;
  1         2  
  1         28  
5 1     1   5 use warnings;
  1         1  
  1         35  
6              
7             # External packages used by packages in this file, that don't export symbols:
8 1     1   422 use only 'Locale::KeyedText' => '1.72.0-';
  0            
  0            
9             use only 'Rosetta' => '0.722.0-';
10              
11             ###########################################################################
12             ###########################################################################
13              
14             # Constant values used by packages in this file:
15             use only 'Readonly' => '1.03-';
16             Readonly my $EMPTY_STR => q{};
17              
18             ###########################################################################
19             ###########################################################################
20              
21             { package Rosetta::Shell; # module
22             use version; our $VERSION = qv('0.1.2');
23              
24             # External packages used by the Rosetta::Shell module, that do export symbols:
25             # (None Yet)
26              
27             # State variables used by the Rosetta::Shell module:
28             my $translator;
29             my $dbms;
30              
31             ###########################################################################
32              
33             sub main {
34             my ($arg_ref) = @_;
35             my $engine_name = $arg_ref->{'engine_name'};
36             my $user_lang_prefs_ref
37             = exists $arg_ref->{'user_lang_prefs'}
38             ? $arg_ref->{'user_lang_prefs'} : ['en'];
39              
40             $translator = Locale::KeyedText::Translator->new({
41             'set_names' => [
42             'Rosetta::Shell::L::',
43             'Rosetta::L::',
44             'Rosetta::Model::L::',
45             'Locale::KeyedText::L::',
46             $engine_name . '::L::',
47             ],
48             'member_names' => $user_lang_prefs_ref,
49             });
50              
51             _show_message( Locale::KeyedText::Message->new({
52             'msg_key' => 'ROS_S_HELLO' }) );
53              
54             eval {
55             $dbms = Rosetta::Interface::DBMS->new({
56             'engine_name' => $engine_name });
57             };
58             if ($@) {
59             _show_message( Locale::KeyedText::Message->new({
60             'msg_key' => 'ROS_S_DBMS_INIT_FAIL',
61             'msg_vars' => {
62             'ENGINE_NAME' => $engine_name,
63             },
64             }) );
65             }
66             else {
67             _show_message( Locale::KeyedText::Message->new({
68             'msg_key' => 'ROS_S_DBMS_INIT_SUCCESS',
69             'msg_vars' => {
70             'ENGINE_NAME' => $engine_name,
71             },
72             }) );
73             _command_loop();
74             }
75              
76             _show_message( Locale::KeyedText::Message->new({
77             'msg_key' => 'ROS_S_GOODBYE' }) );
78              
79             return;
80             }
81              
82             ###########################################################################
83              
84             sub _command_loop {
85             INPUT_LINE:
86             while (1) {
87             _show_message( Locale::KeyedText::Message->new({
88             'msg_key' => 'ROS_S_PROMPT' }) );
89              
90             my $user_input = ;
91             chomp $user_input;
92              
93             # user simply hits return on an empty line to quit the program
94             last INPUT_LINE
95             if $user_input eq $EMPTY_STR;
96              
97             eval {
98             _show_message( Locale::KeyedText::Message->new({
99             'msg_key' => 'ROS_S_TODO_RESULT' }) );
100             };
101             _show_message( $@ )
102             if $@; # input error, detected by library
103             }
104              
105             return;
106             }
107              
108             ###########################################################################
109              
110             sub _show_message {
111             my ($message) = @_;
112             my $user_text = $translator->translate_message( $message );
113             if (!$user_text) {
114             print STDERR "internal error: can't find user text for a message:"
115             . "\n$message$translator"; # note: the objects will stringify
116             return;
117             }
118             print STDOUT $user_text . "\n";
119             return;
120             }
121              
122             ###########################################################################
123              
124             } # module Rosetta::Shell
125              
126             ###########################################################################
127             ###########################################################################
128              
129             1; # Magic true value required at end of a reuseable file's code.
130             __END__