Skip to main content

cranpose_services/
lib.rs

1//! Multiplatform service abstractions used by Cranpose applications.
2
3#![deny(unsafe_code)]
4
5#[cfg(test)]
6use cranpose_core::{location_key, Composition, MemoryApplier};
7
8pub mod device_info;
9pub mod file_picker;
10pub mod haptics;
11pub mod http;
12pub mod image_picker;
13pub mod network_status;
14pub mod notifier;
15#[cfg(not(target_arch = "wasm32"))]
16pub mod peer;
17pub mod share_sheet;
18pub mod theme;
19pub mod uri_handler;
20pub mod writable_folder;
21
22pub use device_info::{
23    clear_platform_device_info, device_info, set_platform_device_info, DeviceInfo, DeviceInfoRef,
24};
25pub use file_picker::{
26    clear_platform_file_picker, default_file_picker, local_file_picker, set_platform_file_picker,
27    FileFilter, FilePicker, FilePickerError, FilePickerOptions, FilePickerRef, FolderStream,
28    FolderStreamRef, PickedEntry, PickedEntryRef, PickedKind, PickerFuture, ProvideFilePicker,
29    ResumedPick,
30};
31pub use haptics::{
32    clear_platform_haptics, default_haptics, local_haptics, set_platform_haptics, HapticFeedback,
33    Haptics, HapticsRef, ProvideHaptics,
34};
35pub use http::{
36    default_http_client, local_http_client, map_ordered_concurrent, HttpClient, HttpClientRef,
37    HttpError, HttpFuture,
38};
39pub use image_picker::{
40    clear_platform_image_picker, default_image_picker, local_image_picker,
41    set_platform_image_picker, ImagePicker, ImagePickerError, ImagePickerRef, ImageSource,
42    ProvideImagePicker, IMAGE_EXTENSIONS,
43};
44pub use network_status::{
45    clear_platform_network_monitor, network_monitor, network_status, set_platform_network_monitor,
46    NetworkMonitor, NetworkMonitorRef, NetworkStatus,
47};
48pub use notifier::{
49    clear_platform_notifier, default_notifier, local_notifier, push_notification_deeplink,
50    set_platform_notifier, take_notification_deeplink, Notifier, NotifierRef, NotifyRequest,
51    ProvideNotifier,
52};
53#[cfg(not(target_arch = "wasm32"))]
54pub use peer::{
55    content_length, fetch_range, fetch_to_writer, ByteSource, BytesSource, FetchResult, PeerError,
56    PeerServer, SourceResolver,
57};
58pub use share_sheet::{
59    clear_platform_share_sheet, default_share_sheet, local_share_sheet, set_platform_share_sheet,
60    ProvideShareSheet, ShareContent, ShareError, ShareSheet, ShareSheetRef,
61};
62pub use theme::{
63    default_system_theme, isSystemInDarkTheme, local_system_theme, ProvideSystemTheme, SystemTheme,
64};
65pub use uri_handler::{
66    clear_platform_uri_handler, default_uri_handler, local_uri_handler, set_platform_uri_handler,
67    ProvideUriHandler, UriHandler, UriHandlerError, UriHandlerRef,
68};
69pub use writable_folder::{
70    clear_platform_writable_folder_picker, open_writable_folder, pick_writable_folder,
71    set_platform_writable_folder_picker, set_writable_folder_store_factory,
72    take_resumed_writable_folder, FolderError, WritableFolderPicker, WritableFolderPickerRef,
73    WritableFolderStore, WritableFolderStoreRef,
74};
75
76/// Convenience alias used in unit tests.
77#[cfg(test)]
78pub(crate) type TestComposition = Composition<MemoryApplier>;
79
80/// Build a composition with a simple in-memory applier and run the provided closure once.
81#[cfg(test)]
82pub(crate) fn run_test_composition(build: impl FnMut()) -> TestComposition {
83    let mut composition = Composition::new(MemoryApplier::new());
84    composition
85        .render(location_key(file!(), line!(), column!()), build)
86        .expect("initial render succeeds");
87    composition
88}