#![cfg_attr(coverage_nightly, coverage(off))]
use crate::models::pdmt::{
ImplementationSpecs, PdmtQualityConfig, PdmtTodo, PdmtTodoList, TodoPriority, TodoQualityGates,
TodoStatus, ValidationCommands,
};
use anyhow::Result;
use std::collections::HashMap;
use tracing::{debug, info};
use uuid::Uuid;
const DETERMINISTIC_GENERATED_AT: &str = "1970-01-01T00:00:00+00:00";
const FNV128_OFFSET_BASIS: u128 = 0x6c62_272e_07bb_0142_62b8_2175_6295_c58d;
const FNV128_PRIME: u128 = 0x0000_0000_0100_0000_0000_0000_0000_013b;
fn fnv1a_128(bytes: &[u8]) -> u128 {
bytes.iter().fold(FNV128_OFFSET_BASIS, |hash, &byte| {
(hash ^ u128::from(byte)).wrapping_mul(FNV128_PRIME)
})
}
pub struct PdmtService {
deterministic_seed: u64,
}
impl PdmtService {
#[must_use]
#[provable_contracts_macros::contract("pmat-core.yaml", equation = "check_compliance")]
pub fn new() -> Self {
Self {
deterministic_seed: 42, }
}
#[provable_contracts_macros::contract("pmat-core.yaml", equation = "check_compliance")]
pub fn generate_todos(
&self,
requirements: Vec<String>,
project_name: Option<String>,
granularity: &str,
quality_config: PdmtQualityConfig,
) -> Result<PdmtTodoList> {
info!(
"Generating deterministic todos for {} requirements",
requirements.len()
);
let project_name = project_name.unwrap_or_else(|| "project".to_string());
let mut todos = Vec::new();
let mut dependency_map = HashMap::new();
for (idx, requirement) in requirements.iter().enumerate() {
let requirement_todos = self.requirement_to_todos(
requirement,
granularity,
&quality_config,
idx,
&mut dependency_map,
)?;
todos.extend(requirement_todos);
}
self.set_dependencies(&mut todos, &dependency_map);
let todo_list = PdmtTodoList {
project_name,
todos,
quality_config,
generated_at: DETERMINISTIC_GENERATED_AT.to_string(),
deterministic_seed: self.deterministic_seed,
};
info!(
"Generated {} deterministic todos with quality enforcement",
todo_list.todos.len()
);
Ok(todo_list)
}
}
impl Default for PdmtService {
fn default() -> Self {
Self::new()
}
}
include!("pdmt_service_generation.rs");
include!("pdmt_service_tests.rs");