use tracing::Span;
use crate::core::{AuditReport, Recorded, SealReceipt};
use crate::error::Error;
use crate::model::Entry;
const KEY_BYTES: usize = 64;
pub(crate) fn key(key: &str) -> String {
let bytes = key.as_bytes();
String::from_utf8_lossy(bytes.get(..KEY_BYTES).unwrap_or(bytes)).into_owned()
}
pub(crate) fn draft_key<const P: u8>(entry: &Entry<P>) -> String {
entry
.key()
.map_or_else(String::new, |found| key(found.as_str()))
}
fn failed(span: &Span, error: &Error) {
match error.rejection() {
Some(rejection) => {
span.record("outcome", "rejected");
span.record("code", rejection.code());
}
None => {
span.record("outcome", "failed");
}
}
}
pub(crate) fn recorded(result: Result<&Recorded, &Error>) {
let span = Span::current();
match result {
Ok(recorded) => {
span.record("outcome", if recorded.replayed { "replay" } else { "new" });
span.record("position", recorded.position);
}
Err(error) => failed(&span, error),
}
}
pub(crate) fn batch(result: Result<&Vec<Recorded>, &Error>) {
let span = Span::current();
match result {
Ok(recorded) => {
let new = recorded.iter().any(|receipt| !receipt.replayed);
span.record("outcome", if new { "new" } else { "replay" });
if let Some(last) = recorded.iter().map(|receipt| receipt.position).max() {
span.record("position", last);
}
}
Err(error) => {
if let Error::BatchRejected { index, .. } = error {
span.record("index", *index);
}
failed(&span, error);
}
}
}
pub(crate) fn cleared(result: Result<&u64, &Error>) {
let span = Span::current();
match result {
Ok(position) => {
span.record("outcome", "ok");
span.record("position", *position);
}
Err(error) => failed(&span, error),
}
}
pub(crate) fn proved(size: u64) {
Span::current().record("size", size);
}
pub(crate) fn sealed<const P: u8>(result: Result<&SealReceipt<P>, &Error>) {
let span = Span::current();
match result {
Ok(receipt) => {
span.record("outcome", "ok");
span.record("position", receipt.position);
}
Err(error) => failed(&span, error),
}
}
pub(crate) fn audited(result: Result<&AuditReport, &Error>) {
let span = Span::current();
match result {
Ok(report) => {
span.record("outcome", "ok");
span.record("records", report.size);
}
Err(error) => failed(&span, error),
}
}