2023-11-29 15:41:29 +00:00
|
|
|
use crate::database::edit::DbEdit;
|
2023-12-05 00:17:02 +00:00
|
|
|
use crate::database::version::EditVersion;
|
2023-11-27 15:34:45 +00:00
|
|
|
use crate::error::MyResult;
|
|
|
|
use anyhow::anyhow;
|
|
|
|
use diffy::{apply, Patch};
|
2023-11-14 23:16:51 +00:00
|
|
|
use rand::{distributions::Alphanumeric, thread_rng, Rng};
|
2023-12-01 13:04:51 +00:00
|
|
|
|
2023-11-14 23:16:51 +00:00
|
|
|
use url::{ParseError, Url};
|
|
|
|
|
2023-11-21 15:27:18 +00:00
|
|
|
pub fn generate_activity_id(domain: &Url) -> Result<Url, ParseError> {
|
2023-11-20 16:04:52 +00:00
|
|
|
let port = domain.port().unwrap();
|
2023-11-15 00:32:46 +00:00
|
|
|
let domain = domain.domain().unwrap();
|
2023-11-14 23:16:51 +00:00
|
|
|
let id: String = thread_rng()
|
|
|
|
.sample_iter(&Alphanumeric)
|
|
|
|
.take(7)
|
|
|
|
.map(char::from)
|
|
|
|
.collect();
|
2023-11-21 15:27:18 +00:00
|
|
|
Url::parse(&format!("http://{}:{}/objects/{}", domain, port, id))
|
2023-11-14 23:16:51 +00:00
|
|
|
}
|
2023-11-27 15:34:45 +00:00
|
|
|
|
|
|
|
/// Starting from empty string, apply edits until the specified version is reached. If no version is
|
|
|
|
/// given, apply all edits up to latest version.
|
|
|
|
///
|
|
|
|
/// TODO: testing
|
|
|
|
/// TODO: should cache all these generated versions
|
2023-11-28 12:04:33 +00:00
|
|
|
pub fn generate_article_version(edits: &Vec<DbEdit>, version: &EditVersion) -> MyResult<String> {
|
2023-11-27 15:34:45 +00:00
|
|
|
let mut generated = String::new();
|
2023-12-01 13:04:51 +00:00
|
|
|
if version == &EditVersion::default() {
|
|
|
|
return Ok(generated);
|
|
|
|
}
|
2023-11-27 15:34:45 +00:00
|
|
|
for e in edits {
|
|
|
|
let patch = Patch::from_str(&e.diff)?;
|
|
|
|
generated = apply(&generated, &patch)?;
|
2023-12-05 00:17:02 +00:00
|
|
|
if &e.hash == version {
|
2023-11-27 15:34:45 +00:00
|
|
|
return Ok(generated);
|
|
|
|
}
|
|
|
|
}
|
2023-11-28 12:04:33 +00:00
|
|
|
Err(anyhow!("failed to generate article version").into())
|
2023-11-27 15:34:45 +00:00
|
|
|
}
|