use crate::contracts::{
ContractClaim, ContractConflict, ContractSchemaState, QueuedCandidate, RetrievedContract,
};
use crate::render::{ContractClaimView, ContractConflictView, ContractQueueItemView, ContractView};
use saya_types::ClaimPayload;
pub(crate) fn contract_view(contract: &RetrievedContract, profile_name: &str) -> ContractView {
ContractView {
profile: profile_name.to_string(),
object: contract.object.qualified_name(),
schema_state: schema_state_str(contract.schema_state),
claims: contract.claims.iter().map(claim_view).collect(),
conflicts: contract.conflicts.iter().map(conflict_view).collect(),
truncated: contract.truncated,
}
}
fn schema_state_str(state: ContractSchemaState) -> String {
match state {
ContractSchemaState::Current => "current",
ContractSchemaState::NeedsReview => "needs_review",
ContractSchemaState::Stale => "stale",
ContractSchemaState::LiveSchemaUnavailable => "live_schema_unavailable",
}
.into()
}
fn claim_view(claim: &ContractClaim) -> ContractClaimView {
let (kind, value, column, reason) = render_payload(&claim.value);
ContractClaimView {
claim_id: claim.id.as_str().to_string(),
kind,
origin: claim.source.as_str().to_string(),
status: claim.status.as_str().to_string(),
value,
column,
reason,
}
}
pub(crate) fn render_payload(
payload: &ClaimPayload,
) -> (String, String, Option<String>, Option<String>) {
match payload {
ClaimPayload::TableDescription { text, .. } => {
(payload.kind().into(), text.clone(), None, None)
}
ClaimPayload::TableAlias { alias, .. } => {
(payload.kind().into(), alias.clone(), None, None)
}
ClaimPayload::TableGrain {
description,
reason,
..
} => (
payload.kind().into(),
description.clone(),
None,
reason.clone(),
),
ClaimPayload::ColumnDescription { column, text, .. } => (
payload.kind().into(),
text.clone(),
Some(column.clone()),
None,
),
ClaimPayload::ColumnRole {
column,
role,
reason,
..
} => (
payload.kind().into(),
role.as_str().into(),
Some(column.clone()),
reason.clone(),
),
ClaimPayload::DefaultTimeColumn { column, reason, .. } => (
payload.kind().into(),
column.clone(),
Some(column.clone()),
reason.clone(),
),
_ => (payload.kind().into(), String::new(), None, None),
}
}
fn conflict_view(conflict: &ContractConflict) -> ContractConflictView {
ContractConflictView {
kind: conflict.kind.to_string(),
claim_ids: conflict
.claim_ids
.iter()
.map(|id| id.as_str().to_string())
.collect(),
}
}
pub(crate) fn queue_item_view(
candidate: &QueuedCandidate,
profile_name: &str,
) -> ContractQueueItemView {
let (kind, value, column, _reason) = candidate
.claim
.payload
.as_ref()
.map(render_payload)
.unwrap_or_else(|| (String::new(), String::new(), None, None));
ContractQueueItemView {
profile: profile_name.to_string(),
claim_id: candidate.claim.id.as_str().to_string(),
status: candidate.claim.status.as_str().to_string(),
kind,
value,
column,
object: candidate.claim.object.qualified_name(),
schema_state: schema_state_str(candidate.schema_state),
evidence_count: candidate.evidence_count,
}
}