ai_pose_generator_2/
lib.rs1const BASE_URL: &str = "https://supermaker.ai/image/ai-pose-generator/";
5
6#[derive(Debug, PartialEq)]
8pub struct Pose {
9 pub nose_x: Option<f32>,
11 pub nose_y: Option<f32>,
13 pub left_eye_x: Option<f32>,
15 pub left_eye_y: Option<f32>,
17 pub right_eye_x: Option<f32>,
19 pub right_eye_y: Option<f32>,
21}
22
23impl Pose {
24 pub fn new() -> Self {
26 Pose {
27 nose_x: None,
28 nose_y: None,
29 left_eye_x: None,
30 left_eye_y: None,
31 right_eye_x: None,
32 right_eye_y: None,
33 }
34 }
35}
36
37pub fn describe_pose(pose: &Pose) -> String {
40 let mut description = String::new();
41
42 if pose.nose_x.is_some() && pose.nose_y.is_some() {
43 description.push_str(&format!(
44 "Nose at ({:.2}, {:.2}). ",
45 pose.nose_x.unwrap(),
46 pose.nose_y.unwrap()
47 ));
48 }
49
50 if pose.left_eye_x.is_some() && pose.left_eye_y.is_some() {
51 description.push_str(&format!(
52 "Left eye at ({:.2}, {:.2}). ",
53 pose.left_eye_x.unwrap(),
54 pose.left_eye_y.unwrap()
55 ));
56 }
57
58 if pose.right_eye_x.is_some() && pose.right_eye_y.is_some() {
59 description.push_str(&format!(
60 "Right eye at ({:.2}, {:.2}). ",
61 pose.right_eye_x.unwrap(),
62 pose.right_eye_y.unwrap()
63 ));
64 }
65
66 if description.is_empty() {
67 "No pose data available.".to_string()
68 } else {
69 description
70 }
71}
72
73pub fn estimate_pose_from_image(_image_data: &[u8]) -> Pose {
76 let mut pose = Pose::new();
79 pose.nose_x = Some(0.5);
80 pose.nose_y = Some(0.6);
81 pose.left_eye_x = Some(0.4);
82 pose.left_eye_y = Some(0.5);
83 pose.right_eye_x = Some(0.6);
84 pose.right_eye_y = Some(0.5);
85 pose
86}
87
88pub fn get_endpoint(path: &str) -> String {
90 let mut url = String::from(BASE_URL);
91 url.push_str(path);
92 url
93}
94
95#[cfg(test)]
96mod tests {
97 use super::*;
98
99 #[test]
100 fn test_pose_creation() {
101 let pose = Pose::new();
102 assert_eq!(pose.nose_x, None);
103 assert_eq!(pose.nose_y, None);
104 assert_eq!(pose.left_eye_x, None);
105 assert_eq!(pose.left_eye_y, None);
106 assert_eq!(pose.right_eye_x, None);
107 assert_eq!(pose.right_eye_y, None);
108 }
109
110 #[test]
111 fn test_describe_pose() {
112 let mut pose = Pose::new();
113 pose.nose_x = Some(0.5);
114 pose.nose_y = Some(0.6);
115 let description = describe_pose(&pose);
116 assert_eq!(description, "Nose at (0.50, 0.60). ");
117
118 let empty_pose = Pose::new();
119 let empty_description = describe_pose(&empty_pose);
120 assert_eq!(empty_description, "No pose data available.");
121 }
122
123 #[test]
124 fn test_get_endpoint() {
125 let path = "api/v1/poses";
126 let expected_url = format!("{}{}", BASE_URL, path);
127 assert_eq!(get_endpoint(path), expected_url);
128 }
129
130 #[test]
131 fn test_estimate_pose_from_image() {
132 let image_data: [u8; 0] = [];
133 let pose = estimate_pose_from_image(&image_data);
134 assert_eq!(pose.nose_x, Some(0.5));
135 assert_eq!(pose.nose_y, Some(0.6));
136 assert_eq!(pose.left_eye_x, Some(0.4));
137 assert_eq!(pose.left_eye_y, Some(0.5));
138 assert_eq!(pose.right_eye_x, Some(0.6));
139 assert_eq!(pose.right_eye_y, Some(0.5));
140 }
141}