use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use uuid::Uuid;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Prompt {
pub id: Uuid,
pub name: String,
pub content: String,
pub variables: Vec<Variable>,
pub tags: Vec<String>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Variable {
pub name: String,
pub description: Option<String>,
pub default_value: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PromptSummary {
pub name: String,
pub variable_count: usize,
pub tag_count: usize,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SearchResult {
pub prompt: Prompt,
pub score: f64,
pub highlighted_content: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ExportData {
pub version: String,
pub exported_at: DateTime<Utc>,
pub prompts: Vec<Prompt>,
}
impl Prompt {
pub fn new(name: String, content: String) -> Self {
let now = Utc::now();
Self {
id: Uuid::new_v4(),
name,
content,
variables: Vec::new(),
tags: Vec::new(),
created_at: now,
updated_at: now,
}
}
pub fn with_variables(mut self, variables: Vec<Variable>) -> Self {
self.variables = variables;
self
}
pub fn with_tags(mut self, tags: Vec<String>) -> Self {
self.tags = tags;
self
}
}
impl Variable {
pub fn new(name: String) -> Self {
Self {
name,
description: None,
default_value: None,
}
}
pub fn with_description(mut self, description: String) -> Self {
self.description = Some(description);
self
}
pub fn with_default(mut self, default_value: String) -> Self {
self.default_value = Some(default_value);
self
}
}