aboutsummaryrefslogtreecommitdiff
path: root/src/house.rs
diff options
context:
space:
mode:
authorCara Salter <cara@devcara.com>2022-04-12 13:30:15 -0400
committerCara Salter <cara@devcara.com>2022-04-12 13:30:15 -0400
commit1fef014508c915b388de371583b0a869684fc7ea (patch)
tree9f2f4c04c472e0883055a8b23a71f724c503ee04 /src/house.rs
parent34af52c58daae7ad75c0871e88e7b937fcd078fb (diff)
downloadsolarlib-1fef014508c915b388de371583b0a869684fc7ea.tar.gz
solarlib-1fef014508c915b388de371583b0a869684fc7ea.zip
Add `House` definition and impls
Also rename modules to make more sense with the theme
Diffstat (limited to 'src/house.rs')
-rw-r--r--src/house.rs61
1 files changed, 61 insertions, 0 deletions
diff --git a/src/house.rs b/src/house.rs
new file mode 100644
index 0000000..6159c33
--- /dev/null
+++ b/src/house.rs
@@ -0,0 +1,61 @@
+/*!
+ * `House`s are where [crate::waifu::Waifu]s live (the physical hypervisors that
+ * libvirtd connects to
+ */
+use crate::waifu::*;
+use crate::errors::Error;
+use serde::{Serialize, Deserialize};
+use std::convert::TryFrom;
+use virt::connect::Connect;
+use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};
+
+#[derive(Serialize, Deserialize, Debug)]
+pub enum Address {
+ IP(String),
+ Domain(String)
+}
+
+impl ToString for Address {
+ fn to_string(&self) -> String {
+ match self {
+ Address::IP(s) => s.clone(),
+ Address::Domain(s) => s.clone(),
+ }
+ }
+}
+
+/// Defines a "house" where waifus live
+#[derive(Debug, Serialize, Deserialize)]
+pub struct House {
+ /// Hostname
+ pub name: String,
+ /// FQDN or IP address, a way to talk to the house
+ pub address: Address
+}
+
+impl House {
+ pub fn new(hostname: String, addr: Address) -> Result<Self, Error> {
+ let mut c = Connect::open(&format!("qemu+ssh://{}/system", addr.to_string()))?;
+
+ // If the connection succeeds, we've got one!
+ Ok(Self {
+ name: hostname.clone(),
+ address: addr
+ })
+ }
+}
+
+#[cfg(test)]
+mod test {
+ use super::*;
+ /// Kind of a stupid test, but just a sanity check to make sure that [ToString] impl up above
+ /// is still working
+ #[test]
+ fn addr_to_string() {
+ let a: Address = Address::IP("127.0.0.1".to_string());
+ let d: Address = Address::Domain("example.com".to_string());
+
+ assert_eq!(String::from("127.0.0.1"), a.to_string());
+ assert_eq!("example.com".to_string(), d.to_string());
+ }
+}