use std::collections::HashSet;
use std::sync::Arc;
use xlink::channels::memory::MemoryChannel;
use xlink::core::types::{ChannelType, DeviceCapabilities, DeviceId, DeviceType};
use xlink::XLink;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init();
let old_id = DeviceId::new();
let caps = DeviceCapabilities {
device_id: old_id,
device_type: DeviceType::Smartphone,
device_name: "Old Phone".to_string(),
supported_channels: HashSet::from([ChannelType::Lan]),
battery_level: Some(100),
is_charging: true,
data_cost_sensitive: false,
};
struct DemoHandler;
#[async_trait::async_trait]
impl xlink::core::traits::MessageHandler for DemoHandler {
async fn handle_message(
&self,
_msg: xlink::core::types::Message,
) -> xlink::core::error::Result<()> {
Ok(())
}
}
let mem_channel = Arc::new(MemoryChannel::new(Arc::new(DemoHandler), 0));
let sdk_old = XLink::new(caps.clone(), vec![mem_channel.clone()]).await?;
sdk_old.start().await?;
log::info!("Old device initialized. ID: {}", old_id);
log::info!("Exporting SDK state from old device...");
let state_data = sdk_old.export_sdk_state()?;
log::info!("State exported ({} bytes).", state_data.len());
let new_id = DeviceId::new();
let mut new_caps = caps.clone();
new_caps.device_id = new_id;
new_caps.device_name = "New Phone".to_string();
let mut sdk_new = XLink::new(new_caps, vec![mem_channel.clone()]).await?;
sdk_new.start().await?;
log::info!("New device initialized. ID: {}", new_id);
log::info!("Importing SDK state to new device...");
sdk_new.import_sdk_state(&state_data)?;
log::info!("State imported successfully. Keys and identity migrated.");
log::info!("Device migration demo completed.");
Ok(())
}