use std::fmt;
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub(crate) enum TranscriptNotice {
BranchPushError,
Commit,
CommitAssist,
CommitError,
ContinueError,
Error,
FollowUpTaskError,
Merge,
MergeError,
MainCheckoutWarning,
QueueError,
Rebase,
RebaseAssist,
RebaseError,
ReplyError,
ReviewRequestSyncWarning,
StartError,
TurnMetadataError,
}
impl TranscriptNotice {
pub(crate) const fn prefix(self) -> &'static str {
match self {
Self::BranchPushError => "[Branch Push Error]",
Self::Commit => "[Commit]",
Self::CommitAssist => "[Commit Assist]",
Self::CommitError => "[Commit Error]",
Self::ContinueError => "[Continue Error]",
Self::Error => "[Error]",
Self::FollowUpTaskError => "[Follow-Up Task Error]",
Self::Merge => "[Merge]",
Self::MergeError => "[Merge Error]",
Self::MainCheckoutWarning => "[Main Checkout Warning]",
Self::QueueError => "[Queue Error]",
Self::Rebase => "[Sync]",
Self::RebaseAssist => "[Sync Assist]",
Self::RebaseError => "[Sync Error]",
Self::ReplyError => "[Reply Error]",
Self::ReviewRequestSyncWarning => "[Review Request Sync Warning]",
Self::StartError => "[Start Error]",
Self::TurnMetadataError => "[Turn Metadata Error]",
}
}
pub(crate) fn format(self, detail: impl fmt::Display) -> String {
format!("\n{}\n", self.format_line(detail))
}
pub(crate) fn format_line(self, detail: impl fmt::Display) -> String {
format!("{} {}", self.prefix(), detail)
}
}
pub(crate) const TRAILING_TRANSCRIPT_NOTICE_PREFIXES: &[&str] = &[
TranscriptNotice::BranchPushError.prefix(),
TranscriptNotice::Commit.prefix(),
TranscriptNotice::CommitAssist.prefix(),
TranscriptNotice::CommitError.prefix(),
TranscriptNotice::ContinueError.prefix(),
TranscriptNotice::Error.prefix(),
TranscriptNotice::FollowUpTaskError.prefix(),
TranscriptNotice::Merge.prefix(),
TranscriptNotice::MergeError.prefix(),
TranscriptNotice::MainCheckoutWarning.prefix(),
TranscriptNotice::QueueError.prefix(),
TranscriptNotice::Rebase.prefix(),
TranscriptNotice::RebaseAssist.prefix(),
TranscriptNotice::RebaseError.prefix(),
TranscriptNotice::ReplyError.prefix(),
TranscriptNotice::ReviewRequestSyncWarning.prefix(),
TranscriptNotice::StartError.prefix(),
TranscriptNotice::TurnMetadataError.prefix(),
];
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_transcript_notice_format_wraps_detail_as_paragraph() {
let notice = TranscriptNotice::RebaseAssist;
let formatted = notice.format("Attempt 1/3. Resolving conflicts in:\n- src/main.rs");
assert_eq!(
formatted,
"\n[Sync Assist] Attempt 1/3. Resolving conflicts in:\n- src/main.rs\n"
);
}
#[test]
fn test_transcript_notice_format_line_omits_paragraph_spacing() {
let notice = TranscriptNotice::Commit;
let formatted = notice.format_line("No changes to commit.");
assert_eq!(formatted, "[Commit] No changes to commit.");
}
#[test]
fn test_trailing_transcript_notice_prefixes_include_generated_labels() {
let generated_labels = [
TranscriptNotice::BranchPushError,
TranscriptNotice::Commit,
TranscriptNotice::CommitAssist,
TranscriptNotice::CommitError,
TranscriptNotice::ContinueError,
TranscriptNotice::Error,
TranscriptNotice::FollowUpTaskError,
TranscriptNotice::Merge,
TranscriptNotice::MergeError,
TranscriptNotice::MainCheckoutWarning,
TranscriptNotice::QueueError,
TranscriptNotice::Rebase,
TranscriptNotice::RebaseAssist,
TranscriptNotice::RebaseError,
TranscriptNotice::ReplyError,
TranscriptNotice::ReviewRequestSyncWarning,
TranscriptNotice::StartError,
TranscriptNotice::TurnMetadataError,
];
for notice in generated_labels {
assert!(TRAILING_TRANSCRIPT_NOTICE_PREFIXES.contains(¬ice.prefix()));
}
}
}