use std::net::{IpAddr, Ipv4Addr};
use structform::{
derive_form_input, impl_numeric_input_with_stringops, impl_text_input_with_stringops,
ParseAndFormat, ParseError, StructForm,
};
#[derive(Debug, PartialEq, Eq)]
struct ConnectionDetails {
ip: IpAddr,
port: u16,
}
#[derive(Default, Clone, StructForm)]
#[structform(model = "ConnectionDetails", submit_with = "submit_connection_details")]
struct ConnectionDetailsForm {
ip: FormTextInput<IpAddr>,
port: FormNumberInput<u16>,
}
fn submit_connection_details(
form: &mut ConnectionDetailsForm,
) -> Result<ConnectionDetails, ParseError> {
let ip = form.ip.submit();
let port = form.port.submit();
Ok(ConnectionDetails {
ip: ip?,
port: port?,
})
}
derive_form_input! {FormTextInput}
impl_text_input_with_stringops!(FormTextInput, IpAddr);
derive_form_input! {FormNumberInput}
impl_numeric_input_with_stringops!(FormNumberInput, "a number", u16, u16);
#[test]
fn we_can_submit_our_form_using_the_custom_submit_function() {
let mut form = ConnectionDetailsForm::default();
form.set_input(ConnectionDetailsFormField::Ip, "127.0.0.1".to_string());
form.set_input(ConnectionDetailsFormField::Port, "80".to_string());
assert_eq!(
form.submit(),
Ok(ConnectionDetails {
ip: IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1)),
port: 80
})
);
}