#![deny(missing_docs)]
use proc_macro::TokenStream;
#[proc_macro_derive(HelloWorld)]
pub fn partial(input: TokenStream) -> TokenStream {
input
}
#[cfg(test)]
mod tests {
struct Example {
foo: f64,
bar: Option<String>,
something_special: u32,
id: u32,
}
#[derive(PartialEq, Default)]
struct PartialExample {
foo: Option<f64>,
bar: Option<Option<String>>,
id: u32, }
impl PartialExample {
fn new(id: u32) -> PartialExample {
PartialExample {
id,
foo: None,
bar: None,
}
}
fn complete(&self) -> bool {
self.foo.is_some() && self.bar.is_some()
}
fn apply(&self, obj: &mut Example) {
if let Some(foo) = &self.foo {
obj.foo = *foo;
}
if let Some(bar) = &self.bar {
obj.bar = bar.clone();
}
}
fn merge_into(&self, obj: &mut PartialExample) {
if let Some(foo) = &self.foo {
obj.foo = Some(*foo);
}
if let Some(bar) = &self.bar {
obj.bar = Some(bar.clone());
}
}
fn partial_equal_existing(&self, obj: &PartialExample) -> bool {
if let Some(foo) = &self.foo {
if let Some(otherfoo) = &obj.foo {
if (*foo - *otherfoo).abs() > std::f64::EPSILON {
return false;
}
}
}
if let Some(bar) = &self.bar {
if let Some(otherbar) = &obj.bar {
if *bar != *otherbar {
return false;
}
}
}
true
}
fn count(&self) -> u32 {
let mut count = 0;
if self.foo.is_some() {
count += 1;
}
if self.bar.is_some() {
count += 1;
}
count
}
fn build(&self) -> Result<Example, ()> {
if let Some(foo) = &self.foo {
if let Some(bar) = &self.bar {
return Ok(Example {
foo: *foo,
bar: bar.clone(),
id: self.id,
something_special: 42,
});
}
}
Err(())
}
}
impl PartialEq<Example> for PartialExample {
fn eq(&self, other: &Example) -> bool {
if let Some(foo) = &self.foo {
if other.foo != *foo {
return false;
}
}
if let Some(bar) = &self.bar {
if other.bar != *bar {
return false;
}
}
true
}
}
#[test]
fn it_works() {
assert_eq!(2 + 2, 4);
}
}