]>
Commit | Line | Data |
---|---|---|
1 | use crate::template::{find, parse, Context}; | |
2 | use std::fs::write; | |
3 | use std::io::{Error, ErrorKind::Other, Result}; | |
4 | use std::path::Path; | |
5 | ||
6 | const FILENAME: &str = "index.gph"; | |
7 | ||
8 | pub fn archive( | |
9 | _: &Path, | |
10 | template_directory: &Path, | |
11 | target: &Path, | |
12 | context: &Context, | |
13 | ) -> Result<()> { | |
14 | if let Some(template) = find(template_directory, FILENAME) { | |
15 | let parsed_template = parse(&template) | |
16 | .ok_or_else(|| Error::new(Other, "Unable to parse Gopher Archive template"))?; | |
17 | let rendered_template = parsed_template.render(context)?; | |
18 | let location = target.join(FILENAME); | |
19 | write(location, rendered_template)?; | |
20 | } | |
21 | Ok(()) | |
22 | } | |
23 | ||
24 | #[cfg(test)] | |
25 | mod tests { | |
26 | use std::collections::HashMap; | |
27 | use std::fs::create_dir_all; | |
28 | ||
29 | use super::*; | |
30 | use crate::template::Value; | |
31 | ||
32 | use test_utilities::*; | |
33 | ||
34 | #[test] | |
35 | fn test_renders_the_context_into_the_template() { | |
36 | let test_dir = setup_test_dir(); | |
37 | let template_dir = test_dir.join("template"); | |
38 | let output_dir = test_dir.join("output"); | |
39 | create_dir_all(&output_dir).expect("Could not create output test directory"); | |
40 | create_dir_all(&template_dir).expect("Could not create template test directory"); | |
41 | ||
42 | create_test_file(&template_dir.join("index.gph"), "Simple {{= test }}"); | |
43 | ||
44 | let context: Context = | |
45 | HashMap::from([("test".to_string(), Value::String("things".to_string()))]); | |
46 | ||
47 | archive(&test_dir, &template_dir, &output_dir, &context).expect("Archive failed"); | |
48 | ||
49 | assert_file_contents(&output_dir.join("index.gph"), "Simple things"); | |
50 | } | |
51 | ||
52 | #[test] | |
53 | fn test_fails_if_template_is_malformed() { | |
54 | let test_dir = setup_test_dir(); | |
55 | let template_dir = test_dir.join("template"); | |
56 | let output_dir = test_dir.join("output"); | |
57 | create_dir_all(&output_dir).expect("Could not create output test directory"); | |
58 | create_dir_all(&template_dir).expect("Could not create template test directory"); | |
59 | ||
60 | create_test_file(&template_dir.join("index.gph"), "Simple {{ test }}"); | |
61 | ||
62 | let context: Context = | |
63 | HashMap::from([("test".to_string(), Value::String("things".to_string()))]); | |
64 | ||
65 | let result = archive(&test_dir, &template_dir, &output_dir, &context); | |
66 | ||
67 | assert!(result.is_err()); | |
68 | } | |
69 | ||
70 | #[test] | |
71 | fn test_fails_if_output_folder_is_not_writable() { | |
72 | let test_dir = setup_test_dir(); | |
73 | let template_dir = test_dir.join("template"); | |
74 | let output_dir = test_dir.join("/gopherunwritable/folder/please"); | |
75 | create_dir_all(&template_dir).expect("Could not create template test directory"); | |
76 | ||
77 | create_test_file(&template_dir.join("index.gph"), "Simple {{= test }}"); | |
78 | ||
79 | let context: Context = | |
80 | HashMap::from([("test".to_string(), Value::String("things".to_string()))]); | |
81 | ||
82 | let result = archive(&test_dir, &template_dir, &output_dir, &context); | |
83 | ||
84 | assert!(result.is_err()); | |
85 | } | |
86 | } |