//! Housing Service Demo //! //! Demonstrates landlord listing and seeker query flow. use meshservice::{ capabilities, identity::ServiceIdentity, router::ServiceRouter, services::housing::{ amenities, create_announce, create_query, HousingService, ListingAnnounce, ListingQuery, ListingType, }, }; fn main() { println!("=== Housing Service Demo ===\n"); // Create identities let landlord1 = ServiceIdentity::generate(); let landlord2 = ServiceIdentity::generate(); let seeker = ServiceIdentity::generate(); // Create router with Housing service let mut router = ServiceRouter::new(capabilities::RELAY); router.register(Box::new(HousingService::relay())); // Landlord 1: Kreuzberg apartment let listing1 = ListingAnnounce::new(ListingType::Apartment, 65, 950, "104") .with_rooms(2) .with_amenities(amenities::FURNISHED | amenities::BALCONY | amenities::INTERNET) .with_title("Sunny 2-room in Kreuzberg"); println!("Landlord 1 announces:"); println!(" {} sqm {} in {}xx", listing1.size_sqm, "Apartment", listing1.postal_prefix); println!(" Rent: {} EUR/month", listing1.rent_euros()); println!(" Rooms: {}", listing1.rooms); println!(" Amenities: Furnished, Balcony, Internet\n"); let msg1 = create_announce(&landlord1, &listing1, 1).unwrap(); router.handle(msg1, Some(landlord1.public_key())).unwrap(); // Landlord 2: Neukölln shared flat room let listing2 = ListingAnnounce::new(ListingType::Room, 18, 450, "120") .with_rooms(1) .with_amenities(amenities::WASHING_MACHINE | amenities::INTERNET) .with_title("Room in friendly WG"); println!("Landlord 2 announces:"); println!(" {} sqm {} in {}xx", listing2.size_sqm, "Room", listing2.postal_prefix); println!(" Rent: {} EUR/month", listing2.rent_euros()); println!(" Amenities: Washing machine, Internet\n"); let msg2 = create_announce(&landlord2, &listing2, 1).unwrap(); router.handle(msg2, Some(landlord2.public_key())).unwrap(); println!("Total listings in store: {}\n", router.store().len()); // Seeker 1: Looking for affordable apartment println!("--- Seeker Query 1: Affordable apartment ---"); let query1 = ListingQuery::new("10", 800) // Any 10xxx area, max 800 EUR .with_type(ListingType::Apartment) .with_min_size(40); println!(" Area: 10xxx"); println!(" Type: Apartment"); println!(" Max rent: 800 EUR"); println!(" Min size: 40 sqm\n"); let query_msg1 = create_query(&seeker, &query1).unwrap(); let matches1 = router.query(&query_msg1); println!("Found {} matches:", matches1.len()); for m in &matches1 { if let Ok(l) = ListingAnnounce::from_bytes(&m.message.payload) { println!(" - {} ({}xx, {} EUR)", l.title.as_deref().unwrap_or("No title"), l.postal_prefix, l.rent_euros()); } } // Seeker 2: Looking for any cheap room println!("\n--- Seeker Query 2: Any room under 500 EUR ---"); let query2 = ListingQuery::new("1", 500); // Any 1xxxx area let query_msg2 = create_query(&seeker, &query2).unwrap(); let matches2 = router.query(&query_msg2); println!("Found {} matches:", matches2.len()); for m in &matches2 { if let Ok(l) = ListingAnnounce::from_bytes(&m.message.payload) { println!(" - {} ({}xx, {} sqm, {} EUR)", l.title.as_deref().unwrap_or("No title"), l.postal_prefix, l.size_sqm, l.rent_euros() ); } } println!("\n=== Demo Complete ==="); }