diff options
author | Daniel Schadt <kingdread@gmx.de> | 2021-03-06 12:23:51 +0100 |
---|---|---|
committer | Daniel Schadt <kingdread@gmx.de> | 2021-03-06 12:23:51 +0100 |
commit | 3cc1856d669eac8097fc064325d4fe53cbdb8175 (patch) | |
tree | 8d5befb9c2f4bb840297553a72e8a11ff313b84c /src | |
parent | d84b4c3466adcc085b7df36015df4b46488ba591 (diff) | |
download | ezau-3cc1856d669eac8097fc064325d4fe53cbdb8175.tar.gz ezau-3cc1856d669eac8097fc064325d4fe53cbdb8175.tar.bz2 ezau-3cc1856d669eac8097fc064325d4fe53cbdb8175.zip |
rework discord text insertion logic
Equipped with the LogBag, we can now rework the "madness" that is the
Discord `find_insertion` thing, even though it wasn't all too bad (and
probably faster than the current version).
Diffstat (limited to 'src')
-rw-r--r-- | src/discord.rs | 31 | ||||
-rw-r--r-- | src/logbag.rs | 31 |
2 files changed, 37 insertions, 25 deletions
diff --git a/src/discord.rs b/src/discord.rs index 4d59580..ea0ea36 100644 --- a/src/discord.rs +++ b/src/discord.rs @@ -2,7 +2,7 @@ use std::sync::Arc; use anyhow::Result; use chrono::prelude::*; -use evtclib::{Log, Outcome}; +use evtclib::Log; use serenity::client::bridge::gateway::ShardManager; use serenity::model::id::*; use serenity::prelude::*; @@ -11,6 +11,7 @@ use tokio::runtime::Runtime; use log::info; use super::categories::Categorizable; +use super::logbag::{LogBag, state_emoji}; const MAX_HOURS: i64 = 5; const MAX_MESSAGE_LENGTH: usize = 2000; @@ -111,29 +112,9 @@ pub fn post_link(discord_token: &str, channel_id: u64, log: &Log, link: &str) -> }) } -fn find_insertion(text: &str, category: &str) -> Option<usize> { - let cat_pos = text.find(&format!("**{}**", category))?; - let empty_line = text[cat_pos..].find("\n\n")?; - Some(cat_pos + empty_line + 1) -} - fn insert_link(text: &str, log: &Log, link: &str) -> String { - let mut text = format!("\n\n{}\n\n", text); - let point = find_insertion(&text, log.category()); - let link_line = format!("{} {}\n", state_emoji(log), link); - if let Some(i) = point { - text.insert_str(i, &link_line); - } else { - text.push_str(&format!("**{}**\n{}", log.category(), link_line)); - } - text.trim().into() -} - -fn state_emoji(log: &Log) -> &'static str { - let outcome = log.analyzer().and_then(|a| a.outcome()); - match outcome { - Some(Outcome::Success) => "✅", - Some(Outcome::Failure) => "❌", - None => "❓", - } + let mut logbag = LogBag::parse_markdown(text).unwrap(); + let line = format!("{} {}", state_emoji(log), link); + logbag.insert(log.category(), line); + logbag.render_markdown() } diff --git a/src/logbag.rs b/src/logbag.rs index f461007..b08098a 100644 --- a/src/logbag.rs +++ b/src/logbag.rs @@ -52,6 +52,14 @@ impl LogBag { input.parse().ok() } + pub fn parse_markdown(input: &str) -> Option<LogBag> { + let plain = input + .split('\n') + .map(|line| line.trim_matches('*')) + .join("\n"); + LogBag::parse_plain(&plain) + } + /// Renders the contents of this [`LogBag`] as plain text. /// /// The output of this can be fed back into [`LogBag::parse_plain`] to round-trip. @@ -179,6 +187,29 @@ line 2" } #[test] + fn parse_markdown() { + let mut logbag = LogBag::new(); + logbag.insert("cat 1", "line 1".to_string()); + logbag.insert("cat 1", "line 2".to_string()); + logbag.insert("cat 2", "line 1".to_string()); + logbag.insert("cat 2", "line 2".to_string()); + + assert_eq!( + LogBag::parse_markdown( + "\ +**cat 1** +line 1 +line 2 + +**cat 2** +line 1 +line 2" + ), + Some(logbag) + ); + } + + #[test] fn render_plain_single() { let mut logbag = LogBag::new(); logbag.insert("category", "line 1".to_string()); |