sdoc/commands/
view.rs

1use workflow::Work;
2use workflow::Instruction::{Display, ExitCode};
3use model::Value;
4use dto::{Request, Response};
5use config::Context;
6use std::fs::File;
7use std::io::prelude::*;
8
9pub fn execute(request: Request, context: &Context) -> Work {
10    Work::instruction(
11        request.next()
12            .current
13            .and_then(|rc| context.find(&rc, true))
14            .map(|command| {
15                if let Some(ref a) = command.value {
16                    return match *a {
17                        Value::Script(ref b) => {
18                            let file_path = context.directory.join(b);
19                            let mut file = File::open(&file_path).unwrap();
20                            let mut content = s!();
21                            file.read_to_string(&mut content).unwrap();
22
23                            Display(format!("{}", content), Response::Ok)
24                        }
25                        Value::Shell(ref b) => Display(format!("{}", b), Response::Ok),
26                        _ => ExitCode(Response::Err(1))
27                    }
28                }
29                ExitCode(Response::Err(1))
30            })
31            .unwrap_or_else(|| ExitCode(Response::Err(1))))
32}
33
34pub fn auto_complete(request: Request, context: &Context) -> Work {
35    Work::instruction(
36        request.next()
37            .current
38            .and_then(|rc| context.find(&rc, false))
39            .map(|_| ExitCode(Response::Ok))
40            .unwrap_or_else(|| {
41                let s = format!("{}", context.get_commands().iter()
42                    .filter(|c| {
43                        if let Some(ref a) = c.value {
44                            return match *a {
45                                Value::Script(_) => true,
46                                Value::Shell(_) => true,
47                                _ => false
48                            }
49                        }
50                        false
51                    })
52                    .fold(s!(), |a, b| format!("{}{}\n", a, &b.name)));
53
54                Display(s, Response::Ok)
55            }))
56}