#[cfg(feature = "pyo3")]
use pyo3::prelude::*;
use super::DEFAULT_MARKER;
#[derive(Debug, Default, PartialEq, Eq, Clone, Copy)]
#[cfg_attr(feature = "pyo3", pyclass(module = "git_bot_feedback", from_py_object))]
pub enum CommentKind {
#[default]
Concerns,
Lgtm,
}
#[derive(Debug, Default, PartialEq, Eq, Clone, Copy)]
#[cfg_attr(feature = "pyo3", pyclass(module = "git_bot_feedback", from_py_object))]
pub enum CommentPolicy {
Anew,
#[default]
Update,
}
#[derive(Debug, Clone)]
#[cfg_attr(
feature = "pyo3",
pyclass(module = "git_bot_feedback", from_py_object, get_all, set_all)
)]
pub struct ThreadCommentOptions {
pub policy: CommentPolicy,
pub comment: String,
pub kind: CommentKind,
pub marker: String,
pub no_lgtm: bool,
}
impl Default for ThreadCommentOptions {
fn default() -> Self {
Self {
policy: Default::default(),
comment: Default::default(),
kind: Default::default(),
marker: DEFAULT_MARKER.to_string(),
no_lgtm: Default::default(),
}
}
}
impl ThreadCommentOptions {
pub fn mark_comment(&self) -> String {
if !self.comment.starts_with(&self.marker) {
return format!("{}{}", self.marker, self.comment);
}
self.comment.clone()
}
}
#[cfg(feature = "pyo3")]
#[pymethods]
impl ThreadCommentOptions {
#[new]
#[pyo3(
signature = (
policy = None,
comment = None,
kind = None,
marker = None,
no_lgtm = None,
),
text_signature = "(policy: CommentPolicy | None = None, comment: str | None = None, kind: CommentKind | None = None, marker: str | None = None, no_lgtm: bool = False)",
)]
pub fn new(
policy: Option<CommentPolicy>,
comment: Option<String>,
kind: Option<CommentKind>,
marker: Option<String>,
no_lgtm: Option<bool>,
) -> Self {
Self {
policy: policy.unwrap_or_default(),
comment: comment.unwrap_or_default(),
kind: kind.unwrap_or_default(),
marker: marker.unwrap_or_else(|| DEFAULT_MARKER.to_string()),
no_lgtm: no_lgtm.unwrap_or_default(),
}
}
}
#[cfg(test)]
mod test {
#![allow(clippy::unwrap_used)]
use super::{DEFAULT_MARKER, ThreadCommentOptions};
use chrono::NaiveDateTime;
#[test]
fn default_marker() {
let mut opts = ThreadCommentOptions::default();
assert_eq!(opts.marker, DEFAULT_MARKER);
let datetime_start = concat!(
"<!-- ",
env!("CARGO_CRATE_NAME"),
"/",
env!("CARGO_PKG_VERSION"),
"/",
)
.len();
let datetime_end = DEFAULT_MARKER.len() - 5;
let datetime_str = &DEFAULT_MARKER[datetime_start..datetime_end];
NaiveDateTime::parse_from_str(datetime_str, "%b-%d-%Y_%H-%M").unwrap();
assert_eq!(opts.mark_comment(), DEFAULT_MARKER);
let comment = format!("{DEFAULT_MARKER}Some text data.");
opts.comment = comment.clone();
assert_eq!(opts.mark_comment(), comment);
}
}