use burn_p2p_core::{AssignmentLease, ContentId, DataReceipt, MicroShardId, WorkDisposition};
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use crate::DataloaderError;
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct DataReceiptBuilder {
pub disposition: WorkDisposition,
pub examples_processed: u64,
pub tokens_processed: u64,
}
impl DataReceiptBuilder {
pub fn accepted(examples_processed: u64, tokens_processed: u64) -> Self {
Self {
disposition: WorkDisposition::Accepted,
examples_processed,
tokens_processed,
}
}
pub fn build(
&self,
lease: &AssignmentLease,
completed_at: DateTime<Utc>,
) -> Result<DataReceipt, DataloaderError> {
let receipt_id = ContentId::derive(&(
lease.lease_id.as_str(),
lease.peer_id.as_str(),
completed_at,
self.examples_processed,
self.tokens_processed,
&self.disposition,
lease
.microshards
.iter()
.map(MicroShardId::as_str)
.collect::<Vec<_>>(),
))?;
Ok(DataReceipt {
receipt_id,
lease_id: lease.lease_id.clone(),
peer_id: lease.peer_id.clone(),
completed_at,
microshards: lease.microshards.clone(),
examples_processed: self.examples_processed,
tokens_processed: self.tokens_processed,
disposition: self.disposition.clone(),
})
}
}