diff --git a/.gitignore b/.gitignore index e27a6dd4..0aa15dbd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ /target +/out ### Rust template # Generated by Cargo # will have compiled files and executables diff --git a/cli/src/args.rs b/cli/src/args.rs index f318fc80..7d75ac36 100644 --- a/cli/src/args.rs +++ b/cli/src/args.rs @@ -25,6 +25,12 @@ use clap::Parser; // We should process the port argument and // pass it to the server on `start` command. // Start command should be added also with clap +// @todo #41:15min Add --report argument together with content type flags. +// Together with --report option let's add flags for XML, TeX, and Text +// reports. So user can generate report in many formats like this: --report +// --tex --html. +// @todo #41:45min Parse content type flag from stdin. Let's pick report generation +// function based on provided flags, such as: --xml, --tex, --txt. #[derive(Parser, Debug)] pub(crate) struct Args { /// The port to run diff --git a/server/resources/report.tex b/server/resources/report.tex new file mode 100644 index 00000000..b4df993b --- /dev/null +++ b/server/resources/report.tex @@ -0,0 +1,7 @@ +\usepackage{to-be-determined} +\documentclass[12pt]{article} +\begin{document} + +\section*{Fakehub report} +\tbd{History: TBD} +\end{document} diff --git a/server/src/lib.rs b/server/src/lib.rs index 5cf132ee..8cbe35ca 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -31,6 +31,7 @@ use crate::xml::storage::touch_storage; mod routes; mod xml; +pub mod report; #[derive(Default)] pub struct Server { diff --git a/server/src/report/latex.rs b/server/src/report/latex.rs new file mode 100644 index 00000000..61ef1978 --- /dev/null +++ b/server/src/report/latex.rs @@ -0,0 +1,92 @@ +// The MIT License (MIT) +// +// Copyright (c) 2024 Aliaksei Bialiauski +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +use std::fs; +use std::path::Path; + +/// +/// Read LaTeX template. +/// @todo #41:60min Add function for appending new content into the template. +/// We need to create new function that will append input into the template, +/// thus it will build a detailed report. +/// # Arguments +/// +/// * `path`: Template path +/// +/// returns: String +/// +/// # Examples +/// +/// ``` +/// use crate::server::report::latex::template; +/// let content = template(None); +/// print!("{content}") +/// ``` +pub fn template(path: Option<&str>) -> String { + return fs::read_to_string( + Path::new(path.unwrap_or("resources/report.tex")) + ).unwrap(); +} + +#[cfg(test)] +mod tests { + use std::fs::File; + use std::io::Write; + use anyhow::Result; + use tempdir::TempDir; + + use crate::report::latex::template; + + #[test] + fn returns_default_template() -> Result<()> { + let content = template(None); + let expected = r"\usepackage{to-be-determined} +\documentclass[12pt]{article} +\begin{document} + +\section*{Fakehub report} +\tbd{History: TBD} +\end{document} +"; + assert_eq!( + content, + expected, + "Template content '{content}' does not match with '{expected}'" + ); + Ok(()) + } + + #[test] + fn returns_custom_template() -> Result<()> { + let temp = TempDir::new("temp")?; + let path = &temp.path().join("custom.tex"); + let expected = "$This is custom template!$"; + let bytes = expected.to_string().into_bytes(); + File::create(path).unwrap().write_all(bytes.as_slice())?; + let content = template(path.to_str()); + assert_eq!( + content, + expected, + "Template content '{content} does not match with '{expected}'" + ); + Ok(()) + } +} diff --git a/server/src/report/mod.rs b/server/src/report/mod.rs new file mode 100644 index 00000000..d320dffa --- /dev/null +++ b/server/src/report/mod.rs @@ -0,0 +1,25 @@ +// The MIT License (MIT) +// +// Copyright (c) 2024 Aliaksei Bialiauski +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. +// @todo #41:45min Create similar to latex.rs functions for XML and TXT formats. +// Let's create similar to latex.rs functions for generating reports in XML and TXT. +// Don't forget to remove this puzzle. +pub mod latex;