2021-03-01 23:39:16 +01:00
use std ::path ::Path ;
2021-04-17 19:31:09 +02:00
use chrono ::{ Utc } ;
2021-04-28 23:46:11 +02:00
use kitchen_fridge ::{ client ::Client , traits ::CalDavSource } ;
use kitchen_fridge ::calendar ::{ CalendarId , SupportedComponents } ;
use kitchen_fridge ::calendar ::cached_calendar ::CachedCalendar ;
use kitchen_fridge ::calendar ::remote_calendar ::RemoteCalendar ;
use kitchen_fridge ::Item ;
use kitchen_fridge ::Task ;
use kitchen_fridge ::task ::CompletionStatus ;
use kitchen_fridge ::ItemId ;
use kitchen_fridge ::cache ::Cache ;
use kitchen_fridge ::CalDavProvider ;
use kitchen_fridge ::traits ::BaseCalendar ;
use kitchen_fridge ::traits ::CompleteCalendar ;
use kitchen_fridge ::settings ::URL ;
use kitchen_fridge ::settings ::USERNAME ;
use kitchen_fridge ::settings ::PASSWORD ;
use kitchen_fridge ::settings ::EXAMPLE_CREATED_CALENDAR_URL ;
use kitchen_fridge ::settings ::EXAMPLE_EXISTING_CALENDAR_URL ;
use kitchen_fridge ::utils ::pause ;
2021-02-24 23:49:20 +01:00
2021-04-19 08:30:34 +02:00
const CACHE_FOLDER : & str = " test_cache/provider_sync " ;
2021-03-31 08:32:28 +02:00
2021-03-01 23:39:16 +01:00
2021-02-24 23:49:20 +01:00
#[ tokio::main ]
async fn main ( ) {
2021-03-31 08:32:28 +02:00
env_logger ::init ( ) ;
2021-04-13 23:30:43 +02:00
println! ( " This examples show how to sync a remote server with a local cache, using a Provider. " ) ;
println! ( " Make sure you have edited your settings.rs to include correct URLs and credentials. " ) ;
println! ( " You can also set the RUST_LOG environment variable to display more info about the sync. " ) ;
pause ( ) ;
2021-04-11 19:15:04 +02:00
2021-03-31 08:32:28 +02:00
let cache_path = Path ::new ( CACHE_FOLDER ) ;
2021-02-24 23:49:20 +01:00
2021-03-31 08:32:28 +02:00
let client = Client ::new ( URL , USERNAME , PASSWORD ) . unwrap ( ) ;
let cache = match Cache ::from_folder ( & cache_path ) {
2021-03-01 23:39:16 +01:00
Ok ( cache ) = > cache ,
Err ( err ) = > {
log ::warn! ( " Invalid cache file: {}. Using a default cache " , err ) ;
Cache ::new ( & cache_path )
}
} ;
2021-03-31 08:32:28 +02:00
let mut provider = Provider ::new ( client , cache ) ;
2021-03-01 23:39:16 +01:00
let cals = provider . local ( ) . get_calendars ( ) . await . unwrap ( ) ;
2021-04-17 19:31:09 +02:00
println! ( " ---- Local items, before sync ----- " ) ;
2021-04-28 23:46:11 +02:00
kitchen_fridge ::utils ::print_calendar_list ( & cals ) . await ;
2021-03-01 23:39:16 +01:00
2021-04-13 23:30:43 +02:00
println! ( " Starting a sync... " ) ;
2021-04-11 19:15:04 +02:00
if provider . sync ( ) . await = = false {
log ::warn! ( " Sync did not complete, see the previous log lines for more info. You can safely start a new sync. " ) ;
2021-03-31 08:32:28 +02:00
}
2021-04-13 23:30:43 +02:00
provider . local ( ) . save_to_folder ( ) . unwrap ( ) ;
2021-04-11 19:15:04 +02:00
2021-04-17 19:31:09 +02:00
println! ( " ---- Local items, after sync ----- " ) ;
2021-03-31 08:32:28 +02:00
let cals = provider . local ( ) . get_calendars ( ) . await . unwrap ( ) ;
2021-04-28 23:46:11 +02:00
kitchen_fridge ::utils ::print_calendar_list ( & cals ) . await ;
2021-04-13 23:30:43 +02:00
2021-04-20 00:01:05 +02:00
add_items_and_sync_again ( & mut provider ) . await ;
2021-04-13 23:30:43 +02:00
}
2021-04-17 19:31:09 +02:00
async fn add_items_and_sync_again (
2021-04-20 00:01:05 +02:00
provider : & mut Provider < Cache , CachedCalendar , Client , RemoteCalendar > )
2021-04-17 19:31:09 +02:00
{
2021-04-20 00:01:05 +02:00
println! ( " \n Now, we'll add a calendar and a few tasks and run the sync again. " ) ;
2021-04-13 23:30:43 +02:00
pause ( ) ;
2021-04-20 00:01:05 +02:00
// Create a new calendar...
let new_calendar_id : CalendarId = EXAMPLE_CREATED_CALENDAR_URL . parse ( ) . unwrap ( ) ;
let new_calendar_name = " A brave new calendar " . to_string ( ) ;
2021-04-20 00:00:18 +02:00
if let Err ( _err ) = provider . local_mut ( )
. create_calendar ( new_calendar_id . clone ( ) , new_calendar_name . clone ( ) , SupportedComponents ::TODO )
. await {
println! ( " Unable to add calendar, maybe it exists already. We're not adding it after all. " ) ;
}
2021-04-20 00:01:05 +02:00
// ...and add a task in it
let new_name = " This is a new task in a new calendar " ;
let new_task = Task ::new ( String ::from ( new_name ) , true , & new_calendar_id ) ;
provider . local ( ) . get_calendar ( & new_calendar_id ) . await . unwrap ( )
. lock ( ) . unwrap ( ) . add_item ( Item ::Task ( new_task ) ) . await . unwrap ( ) ;
2021-04-17 19:31:09 +02:00
2021-04-20 00:01:05 +02:00
// Also create a task in a previously existing calendar
let changed_calendar_id : CalendarId = EXAMPLE_EXISTING_CALENDAR_URL . parse ( ) . unwrap ( ) ;
let new_task_name = " This is a new task we're adding as an example, with ÜTF-8 characters " ;
let new_task = Task ::new ( String ::from ( new_task_name ) , false , & changed_calendar_id ) ;
let new_id = new_task . id ( ) . clone ( ) ;
provider . local ( ) . get_calendar ( & changed_calendar_id ) . await . unwrap ( )
2021-04-17 19:31:09 +02:00
. lock ( ) . unwrap ( ) . add_item ( Item ::Task ( new_task ) ) . await . unwrap ( ) ;
2021-04-13 23:30:43 +02:00
2021-04-20 00:01:05 +02:00
2021-04-13 23:30:43 +02:00
if provider . sync ( ) . await = = false {
log ::warn! ( " Sync did not complete, see the previous log lines for more info. You can safely start a new sync. The new task may not have been synced. " ) ;
} else {
2021-04-20 00:01:05 +02:00
println! ( " Done syncing the new task ' {} ' and the new calendar ' {} ' " , new_task_name , new_calendar_name ) ;
2021-04-13 23:30:43 +02:00
}
provider . local ( ) . save_to_folder ( ) . unwrap ( ) ;
2021-04-20 00:01:05 +02:00
complete_item_and_sync_again ( provider , & changed_calendar_id , & new_id ) . await ;
2021-04-17 19:31:09 +02:00
}
async fn complete_item_and_sync_again (
provider : & mut Provider < Cache , CachedCalendar , Client , RemoteCalendar > ,
changed_calendar_id : & CalendarId ,
id_to_complete : & ItemId )
{
println! ( " \n Now, we'll mark this last task as completed, and run the sync again. " ) ;
pause ( ) ;
let completion_status = CompletionStatus ::Completed ( Some ( Utc ::now ( ) ) ) ;
provider . local ( ) . get_calendar ( changed_calendar_id ) . await . unwrap ( )
. lock ( ) . unwrap ( ) . get_item_by_id_mut ( id_to_complete ) . await . unwrap ( )
. unwrap_task_mut ( )
. set_completion_status ( completion_status ) ;
if provider . sync ( ) . await = = false {
log ::warn! ( " Sync did not complete, see the previous log lines for more info. You can safely start a new sync. The new task may not have been synced. " ) ;
} else {
println! ( " Done syncing the completed task " ) ;
}
provider . local ( ) . save_to_folder ( ) . unwrap ( ) ;
2021-04-20 00:01:05 +02:00
remove_items_and_sync_again ( provider , changed_calendar_id , id_to_complete ) . await ;
2021-04-17 19:31:09 +02:00
}
2021-04-20 00:01:05 +02:00
async fn remove_items_and_sync_again (
2021-04-17 19:31:09 +02:00
provider : & mut Provider < Cache , CachedCalendar , Client , RemoteCalendar > ,
changed_calendar_id : & CalendarId ,
id_to_remove : & ItemId )
{
println! ( " \n Now, we'll delete this last task, and run the sync again. " ) ;
pause ( ) ;
2021-04-20 00:01:05 +02:00
// Remove the task we had created
2021-04-17 19:31:09 +02:00
provider . local ( ) . get_calendar ( changed_calendar_id ) . await . unwrap ( )
. lock ( ) . unwrap ( )
. mark_for_deletion ( id_to_remove ) . await . unwrap ( ) ;
if provider . sync ( ) . await = = false {
log ::warn! ( " Sync did not complete, see the previous log lines for more info. You can safely start a new sync. The new task may not have been synced. " ) ;
} else {
println! ( " Done syncing the deleted task " ) ;
}
provider . local ( ) . save_to_folder ( ) . unwrap ( ) ;
2021-04-13 23:30:43 +02:00
println! ( " Done. You can start this example again to see the cache being restored from its current saved state " )
2021-02-24 23:49:20 +01:00
}