use smol_str::SmolStr;
use std::vec::Vec;
#[derive(Debug, Clone, Default, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct ImageAnalysis {
scene: SmolStr,
description: SmolStr,
subjects: Vec<SmolStr>,
objects: Vec<SmolStr>,
actions: Vec<SmolStr>,
mood: Vec<SmolStr>,
shot_type: SmolStr,
lighting: Vec<SmolStr>,
tags: Vec<SmolStr>,
}
impl ImageAnalysis {
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn new() -> Self {
Self::default()
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn scene(&self) -> &str {
&self.scene
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn with_scene(mut self, val: impl Into<SmolStr>) -> Self {
self.scene = val.into();
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn set_scene(&mut self, val: impl Into<SmolStr>) -> &mut Self {
self.scene = val.into();
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn description(&self) -> &str {
&self.description
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn with_description(mut self, val: impl Into<SmolStr>) -> Self {
self.description = val.into();
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn set_description(&mut self, val: impl Into<SmolStr>) -> &mut Self {
self.description = val.into();
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn subjects(&self) -> &[SmolStr] {
&self.subjects
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn with_subjects(mut self, val: Vec<SmolStr>) -> Self {
self.subjects = val;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn set_subjects(&mut self, val: Vec<SmolStr>) -> &mut Self {
self.subjects = val;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn objects(&self) -> &[SmolStr] {
&self.objects
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn with_objects(mut self, val: Vec<SmolStr>) -> Self {
self.objects = val;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn set_objects(&mut self, val: Vec<SmolStr>) -> &mut Self {
self.objects = val;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn actions(&self) -> &[SmolStr] {
&self.actions
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn with_actions(mut self, val: Vec<SmolStr>) -> Self {
self.actions = val;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn set_actions(&mut self, val: Vec<SmolStr>) -> &mut Self {
self.actions = val;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn mood(&self) -> &[SmolStr] {
&self.mood
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn with_mood(mut self, val: Vec<SmolStr>) -> Self {
self.mood = val;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn set_mood(&mut self, val: Vec<SmolStr>) -> &mut Self {
self.mood = val;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn shot_type(&self) -> &str {
&self.shot_type
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn with_shot_type(mut self, val: impl Into<SmolStr>) -> Self {
self.shot_type = val.into();
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn set_shot_type(&mut self, val: impl Into<SmolStr>) -> &mut Self {
self.shot_type = val.into();
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn lighting(&self) -> &[SmolStr] {
&self.lighting
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn with_lighting(mut self, val: Vec<SmolStr>) -> Self {
self.lighting = val;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn set_lighting(&mut self, val: Vec<SmolStr>) -> &mut Self {
self.lighting = val;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn tags(&self) -> &[SmolStr] {
&self.tags
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn with_tags(mut self, val: Vec<SmolStr>) -> Self {
self.tags = val;
self
}
#[cfg_attr(not(tarpaulin), inline(always))]
pub fn set_tags(&mut self, val: Vec<SmolStr>) -> &mut Self {
self.tags = val;
self
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::vec;
#[test]
fn default_is_empty() {
let s = ImageAnalysis::new();
assert!(s.scene().is_empty());
assert!(s.description().is_empty());
assert!(s.subjects().is_empty());
assert_eq!(s, ImageAnalysis::default());
}
#[test]
fn builder_chains() {
let s = ImageAnalysis::new()
.with_scene("airport")
.with_description("travelers walking through terminal")
.with_subjects(vec!["middle-aged woman".into(), "child".into()])
.with_tags(vec!["airport".into(), "travel".into(), "indoor".into()]);
assert_eq!(s.scene(), "airport");
assert_eq!(s.subjects().len(), 2);
assert_eq!(s.tags().len(), 3);
}
#[test]
fn set_in_place() {
let mut s = ImageAnalysis::new();
s.set_scene("plaza");
assert_eq!(s.scene(), "plaza");
}
}