use std::borrow::Cow;
use derivative::Derivative;
use serde::{Deserialize, Serialize};
use super::Builder;
#[derive(Derivative, Debug, Serialize, Deserialize)]
pub struct Machine<'m> {
smt: bool,
track_dirty_pages: bool,
mem_size_mib: i64,
vcpu_count: usize,
#[serde(skip_serializing_if = "Option::is_none")]
cpu_template: Option<Cow<'m, str>>,
}
impl<'m> Machine<'m> {
pub fn smt(&self) -> bool {
self.smt
}
pub fn track_dirty_pages(&self) -> bool {
self.track_dirty_pages
}
pub fn mem_size_mib(&self) -> i64 {
self.mem_size_mib
}
pub fn vcpu_count(&self) -> usize {
self.vcpu_count
}
pub fn cpu_template(&self) -> Option<&str> {
self.cpu_template.as_deref()
}
}
impl Default for Machine<'_> {
fn default() -> Self {
Machine {
smt: false,
track_dirty_pages: false,
mem_size_mib: 1024,
vcpu_count: 1,
cpu_template: None,
}
}
}
#[derive(Debug)]
pub struct MachineBuilder<'m> {
config_builder: Builder<'m>,
machine: Machine<'m>,
}
impl<'m> MachineBuilder<'m> {
pub(crate) fn new(config_builder: Builder<'m>) -> Self {
Self {
config_builder,
machine: Machine::default(),
}
}
pub fn smt(mut self, smt: bool) -> Self {
self.machine.smt = smt;
self
}
pub fn track_dirty_pages(mut self, track_dirty_pages: bool) -> Self {
self.machine.track_dirty_pages = track_dirty_pages;
self
}
pub fn mem_size_mib(mut self, mem_size_mib: i64) -> Self {
self.machine.mem_size_mib = mem_size_mib;
self
}
pub fn vcpu_count(mut self, vcpu_count: usize) -> Self {
self.machine.vcpu_count = vcpu_count;
self
}
pub fn cpu_template(mut self, cpu_template: Cow<'m, str>) -> Self {
self.machine.cpu_template = Some(cpu_template);
self
}
pub fn build(mut self) -> Builder<'m> {
self.config_builder.0.machine_cfg = self.machine;
self.config_builder
}
}