You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

94 lines
2.5KB

  1. use std::collections::{HashMap};
  2. use base64::{encode, decode};
  3. use pulldown_cmark as cmark;
  4. use tera::{Value, to_value, Result as TeraResult};
  5. // fn(Value, HashMap<String, Value>) -> Result<Value>
  6. pub fn markdown(value: Value, _: HashMap<String, Value>) -> TeraResult<Value> {
  7. let s = try_get_value!("markdown", "value", String, value);
  8. let mut html = String::new();
  9. let parser = cmark::Parser::new(&s);
  10. cmark::html::push_html(&mut html, parser);
  11. Ok(to_value(&html).unwrap())
  12. }
  13. pub fn base64_encode(value: Value, _: HashMap<String, Value>) -> TeraResult<Value> {
  14. let s = try_get_value!("base64_encode", "value", String, value);
  15. Ok(
  16. to_value(&encode(s.as_bytes())).unwrap()
  17. )
  18. }
  19. pub fn base64_decode(value: Value, _: HashMap<String, Value>) -> TeraResult<Value> {
  20. let s = try_get_value!("base64_decode", "value", String, value);
  21. Ok(
  22. to_value(
  23. &String::from_utf8(
  24. decode(s.as_bytes()).unwrap()
  25. ).unwrap()
  26. ).unwrap()
  27. )
  28. }
  29. #[cfg(test)]
  30. mod tests {
  31. use std::collections::HashMap;
  32. use tera::{to_value};
  33. use super::{markdown, base64_decode, base64_encode};
  34. #[test]
  35. fn test_markdown() {
  36. let result = markdown(to_value(&"# Hey").unwrap(), HashMap::new());
  37. assert!(result.is_ok());
  38. assert_eq!(result.unwrap(), to_value(&"<h1>Hey</h1>\n").unwrap());
  39. }
  40. #[test]
  41. fn test_base64_encode() {
  42. // from https://tools.ietf.org/html/rfc4648#section-10
  43. let tests = vec![
  44. ("", ""),
  45. ("f", "Zg=="),
  46. ("fo", "Zm8="),
  47. ("foo", "Zm9v"),
  48. ("foob", "Zm9vYg=="),
  49. ("fooba", "Zm9vYmE="),
  50. ("foobar", "Zm9vYmFy")
  51. ];
  52. for (input, expected) in tests {
  53. let args = HashMap::new();
  54. let result = base64_encode(to_value(input).unwrap(), args);
  55. assert!(result.is_ok());
  56. assert_eq!(result.unwrap(), to_value(expected).unwrap());
  57. }
  58. }
  59. #[test]
  60. fn test_base64_decode() {
  61. let tests = vec![
  62. ("", ""),
  63. ("Zg==", "f"),
  64. ("Zm8=", "fo"),
  65. ("Zm9v", "foo"),
  66. ("Zm9vYg==", "foob"),
  67. ("Zm9vYmE=", "fooba"),
  68. ("Zm9vYmFy", "foobar")
  69. ];
  70. for (input, expected) in tests {
  71. let args = HashMap::new();
  72. let result = base64_decode(to_value(input).unwrap(), args);
  73. assert!(result.is_ok());
  74. assert_eq!(result.unwrap(), to_value(expected).unwrap());
  75. }
  76. }
  77. }