use llm_toolkit::ToPrompt;
use serde::Serialize;
#[derive(ToPrompt, Default, Serialize)]
#[prompt(mode = "schema_only")]
struct StyleGuide {
color_palette: String,
camera_angle: String,
}
#[derive(ToPrompt, Default, Serialize)]
#[prompt(mode = "schema_only")]
struct Concept {
#[prompt(example = "a futuristic city")]
prompt: String,
style: String,
}
#[derive(ToPrompt, Serialize)]
#[prompt(template = r#"
SYSTEM PROMPT:
{{ system_prompt }}
---
USER CONCEPT:
{{ user_concept }}
---
STYLE GUIDE (Schema Only):
{{ style_guide:schema_only }}
---
ALTERNATIVE CONCEPT:
{{ alternative:example_only }}
"#)]
struct ImageGenerationPrompt {
system_prompt: String,
user_concept: Concept,
style_guide: StyleGuide,
alternative: Concept,
}
#[test]
fn test_template_with_mode_syntax() {
let prompt = ImageGenerationPrompt {
system_prompt: "Generate a high-quality image".to_string(),
user_concept: Concept {
prompt: "a bustling marketplace".to_string(),
style: "photorealistic".to_string(),
},
style_guide: StyleGuide {
color_palette: "warm tones".to_string(),
camera_angle: "birds eye view".to_string(),
},
alternative: Concept {
prompt: "a serene garden".to_string(),
style: "watercolor".to_string(),
},
};
let output = prompt.to_prompt();
println!("Generated output:\n{}", output);
assert!(output.contains("SYSTEM PROMPT:"));
assert!(output.contains("Generate a high-quality image"));
assert!(output.contains("USER CONCEPT:"));
assert!(output.contains("type Concept = {"));
assert!(output.contains("STYLE GUIDE (Schema Only):"));
assert!(output.contains("type StyleGuide = {"));
assert!(!output.contains("warm tones"));
assert!(!output.contains("birds eye view"));
assert!(output.contains("ALTERNATIVE CONCEPT:"));
assert!(output.contains("\"prompt\""));
assert!(output.contains("\"serene garden\"") || output.contains("\"a futuristic city\"")); assert!(output.contains("\"style\""));
}
#[derive(ToPrompt, Serialize)]
#[prompt(template = "User {{ name }} has role {{ role }}.")]
struct SimpleUser {
name: String,
role: String,
}
#[test]
fn test_template_without_mode_syntax_backward_compat() {
let user = SimpleUser {
name: "Alice".to_string(),
role: "Admin".to_string(),
};
let output = user.to_prompt();
assert_eq!(output, "User Alice has role Admin.");
}
#[derive(ToPrompt, Serialize, Default)]
#[prompt(mode = "schema_only")]
struct TaskConfig {
priority: u32,
deadline: String,
}
#[derive(ToPrompt, Serialize)]
#[prompt(template = r#"Task Management System
Configuration:
{{ config:full }}
Quick Reference (Schema):
{{ config:schema_only }}
Example Configuration:
{{ config:example_only }}
"#)]
struct TaskManagement {
config: TaskConfig,
}
#[test]
fn test_same_field_with_different_modes() {
let task_mgmt = TaskManagement {
config: TaskConfig {
priority: 1,
deadline: "2024-12-31".to_string(),
},
};
let output = task_mgmt.to_prompt();
assert!(output.contains("Configuration:"));
assert!(output.contains("Quick Reference (Schema):"));
assert!(output.contains("Example Configuration:"));
let config_mentions = output.matches("TaskConfig").count();
assert!(config_mentions >= 2); }
#[derive(ToPrompt, Serialize)]
#[prompt(template = "Name: {{ name }}, ID: {{ id }}")]
struct PrimitiveFields {
name: String,
id: u32,
}
#[test]
fn test_template_with_primitive_fields() {
let data = PrimitiveFields {
name: "test value".to_string(),
id: 42,
};
let output = data.to_prompt();
assert!(output.contains("Name: test value"));
assert!(output.contains("ID: 42"));
}