Skip to main content

cranpose_services/
lib.rs

1#![doc = include_str!("../README.md")]
2
3#[cfg(test)]
4use cranpose_core::{Composition, MemoryApplier, location_key};
5
6pub mod accessibility_options;
7pub mod accessibility_state;
8pub mod app_info;
9pub mod app_update;
10pub mod async_io;
11pub mod audio;
12pub mod background;
13pub mod bundled_assets;
14pub mod camera;
15mod composition_locals;
16pub mod content;
17pub mod device_info;
18mod durable_save;
19pub mod file_picker;
20#[cfg(not(target_arch = "wasm32"))]
21pub mod github_release_updater;
22pub mod haptics;
23pub mod heart_rate;
24#[cfg(not(target_arch = "wasm32"))]
25mod helper_process;
26pub mod host;
27pub mod host_messages;
28pub mod host_surface;
29pub mod http;
30pub mod image_picker;
31pub mod incoming_share;
32pub mod launch_args;
33pub mod launcher;
34pub mod media;
35pub mod memory_pressure;
36pub mod microphone_permission;
37pub mod microphone_standby;
38pub mod navigation;
39pub mod network_status;
40pub mod notifier;
41#[cfg(not(target_arch = "wasm32"))]
42pub mod peer;
43pub mod power;
44pub mod preferences;
45pub mod purchases;
46mod registry;
47pub mod share_sheet;
48pub mod storage;
49pub mod theme;
50mod thread_state;
51pub mod uri_handler;
52pub mod wearable;
53pub mod wearable_framed;
54pub mod writable_folder;
55
56pub use accessibility_options::{
57    AccessibilityOptions, ProvideAccessibilityOptions, local_accessibility_options,
58    platform_accessibility_options, set_platform_accessibility_options,
59};
60pub use accessibility_state::{
61    AccessibilityState, ProvideAccessibilityState, local_accessibility_state,
62    platform_accessibility_state, set_platform_accessibility_state,
63};
64pub use app_info::{
65    AppInfo, AppInfoRef, app_info, build_version, clear_platform_app_info, set_platform_app_info,
66    version_name,
67};
68pub use app_update::{
69    AppUpdateCapabilities, AppUpdateError, AppUpdateObserver, AppUpdateStatus, AppUpdater,
70    AppUpdaterRef, DigestAlgorithm, DigestVerifier, GitHubReleaseUpdate, PackageDigest,
71    UpdatePackage, app_update_capabilities, app_update_checks_supported, app_update_status,
72    app_updates_supported, check_for_app_update, clear_platform_app_updater, install_app_update,
73    observe_app_update_status, set_app_update_status, set_platform_app_updater, sha256_hex,
74    verify_package,
75};
76pub use async_io::{ChunkChannel, ChunkNext, ChunkStream, MAX_PENDING_CHUNKS, Signal, SignalWait};
77pub use audio::{
78    AudioBus, AudioClip, AudioError, AudioPlayer, AudioPlayerRef, NoopAudioPlayer, PlaybackParams,
79    ProvideAudio, SoundBank, SoundBankEntry, SoundBankFailure, SoundId, SoundSpec, VoiceId,
80    clear_platform_audio, default_audio, local_audio, rememberSoundBank, set_platform_audio,
81};
82pub use background::{
83    BackgroundActivity, BackgroundActivityRef, BackgroundWork, BackgroundWorkLease,
84    acquire_background_work, background_active, background_activity,
85    clear_platform_background_activity, set_platform_background_activity,
86};
87#[cfg(not(target_arch = "wasm32"))]
88pub use bundled_assets::{
89    BundledAssetEntry, BundledAssetInstallOutcome, BundledAssetInstallSpec,
90    install_bundled_asset_set,
91};
92pub use bundled_assets::{
93    BundledAssetError, BundledAssetReader, BundledAssets, BundledAssetsRef, StreamingAssetReader,
94    bundled_assets, clear_platform_bundled_assets, set_platform_bundled_assets,
95};
96pub use camera::{
97    Camera, CameraError, CameraFrame, CameraLens, CameraLenses, CameraObserver, CameraRef,
98    CameraState, CameraStill, FlashMode, FrameFormat, LensFacing, UprightRgba, camera,
99    camera_lenses, camera_state, camera_supported, capture_camera_still, clear_platform_camera,
100    dropped_camera_frames, latest_camera_frame, observe_camera_frames, observe_camera_lenses,
101    observe_camera_state, observe_camera_stills, publish_camera_frame, publish_camera_lenses,
102    publish_camera_state, publish_camera_still, record_dropped_camera_frame, rememberCameraFrames,
103    rememberCameraLenses, rememberCameraState, rememberCameraStills, request_camera_still,
104    set_platform_camera, start_camera, stop_camera,
105};
106pub use content::{
107    BytesContent, Content, ContentChannel, ContentEntry, ContentError, ContentFolder,
108    ContentFolderRef, ContentFuture, ContentHandle, ContentMetadata, ContentReader,
109    ContentReaderRef, ContentResolver, ContentResolverRef, ContentSink, ContentSinkRef,
110    ContentStream, ContentStreamRef, DEFAULT_CHUNK_LEN, ReadyFolder,
111    clear_platform_content_resolver, collect_stream, drain_reader, folder_files, percent_decode,
112    percent_decode_lossy, resolve_content, set_platform_content_resolver, write_all,
113};
114#[cfg(not(target_arch = "wasm32"))]
115pub use content::{FileContent, FileFolder, FileSink, file_content, file_folder};
116pub use device_info::{
117    DeviceInfo, DeviceInfoRef, clear_platform_device_info, device_info, release_free_memory,
118    set_platform_device_info,
119};
120pub use file_picker::{
121    FileFilter, FilePicker, FilePickerError, FilePickerOptions, FilePickerRef, PickerFuture,
122    ProvideFilePicker, RecoveredPick, SaveDocumentRequest, clear_platform_file_picker,
123    default_file_picker, local_file_picker, set_platform_file_picker,
124};
125#[cfg(not(target_arch = "wasm32"))]
126pub use github_release_updater::GitHubAppUpdater;
127pub use haptics::{
128    HapticEffect, HapticError, HapticFeedback, HapticPattern, Haptics, HapticsRef, ProvideHaptics,
129    clear_platform_haptics, default_haptics, local_haptics, set_platform_haptics,
130};
131pub use heart_rate::{
132    HeartRate, HeartRateError, HeartRateMonitor, HeartRateMonitorRef, HeartRatePermission,
133    HeartRateReader, HeartRateStatus, clear_platform_heart_rate, heart_rate, heart_rate_available,
134    heart_rate_permission, observe_heart_rate, publish_heart_rate, publish_heart_rate_permission,
135    rememberHeartRate, request_heart_rate_permission, set_platform_heart_rate,
136};
137#[cfg(not(target_arch = "wasm32"))]
138pub use helper_process::windowless_command;
139pub use host::{
140    DEFAULT_DURABLE_SAVE_DEADLINE, DurableSaveEffect, DurableSaveError, DurableSaveOutcome,
141    DurableSaveRegistration, HostController, HostControllerRef, LifecycleEvent, LifecycleObserver,
142    LifecycleState, PlatformDirectories, PlatformDirectoryError, ProvideLifecycle,
143    advance_lifecycle, application_directories, application_id, background_app,
144    clear_application_id, clear_host_controller, current_lifecycle_state, dispatch_lifecycle,
145    dispatch_lifecycle_state, durable_save_deadline, exit_app, host_controller,
146    local_lifecycle_state, observe_lifecycle, register_durable_save, register_preference_save,
147    rememberLifecycleEvents, rememberLifecycleState, run_durable_saves, set_application_id,
148    set_host_controller, set_keep_screen_on, window_lifecycle_state,
149};
150pub use host_messages::{
151    HostMessage, HostMessageObserver, clear_host_messages, clear_host_outbox, install_host_outbox,
152    observe_host_messages, publish_host_message, rememberHostMessages, send_to_host,
153};
154pub use host_surface::{
155    HostSurface, HostSurfaceObserver, HostSurfaceRef, HostSurfaceSize, ResizeRefused,
156    clear_platform_host_surface, host_surface, host_surface_size, observe_host_surface_size,
157    publish_host_surface_size, rememberHostSurfaceSize, request_host_surface_size,
158    set_platform_host_surface,
159};
160pub use http::{
161    BytesBody, CancelTransfer, HttpBody, HttpBodyRef, HttpClient, HttpClientRef, HttpControl,
162    HttpError, HttpFuture, HttpMethod, HttpProgress, HttpRequest, HttpResponse, ProgressHandler,
163    StubAnswer, StubHttpClient, default_http_client, http_body_ref, local_http_client,
164    map_ordered_concurrent,
165};
166#[cfg(not(target_arch = "wasm32"))]
167pub use http::{PlatformDownloader, downloaded_length, set_platform_downloader};
168pub use image_picker::{
169    IMAGE_EXTENSIONS, ImagePicker, ImagePickerError, ImagePickerRef, ImageSource,
170    ProvideImagePicker, clear_platform_image_picker, default_image_picker, local_image_picker,
171    set_platform_image_picker,
172};
173pub use incoming_share::{
174    IncomingContent, IncomingContentObserver, IncomingSource, clear_incoming_content,
175    observe_incoming_content, publish_incoming_content, rememberIncomingContent,
176};
177pub use launch_args::{
178    LaunchArgValue, LaunchArgs, LaunchArgsRef, ProvideLaunchArgs, clear_platform_launch_args,
179    is_debuggable, isDebuggable, launch_args, launch_args_from_command_line, local_launch_args,
180    set_platform_launch_args,
181};
182pub use launcher::{
183    LauncherResult, OpenFileLauncher, OpenFilesLauncher, OpenFolderLauncher, SaveDocumentLauncher,
184    WritableFolderLauncher, clear_launcher_state, rememberOpenFileLauncher,
185    rememberOpenFilesLauncher, rememberOpenFolderLauncher, rememberSaveDocumentLauncher,
186    rememberWritableFolderLauncher,
187};
188pub use media::{
189    AudioFocus, DUCKED_GAIN, EqualizerBand, EqualizerSettings, MediaArtwork, MediaCapabilities,
190    MediaCommand, MediaError, MediaItem, MediaMetadata, MediaObserver, MediaPlayer, MediaPlayerRef,
191    MediaSamples, MediaSourceHandle, MediaSourceOpener, MediaSourceOpenerRef,
192    OCTAVE_BAND_CENTERS_HZ, PlaybackProgress, PlaybackState, audio_focus,
193    clear_platform_media_player, clear_platform_media_source_opener, current_media_item,
194    dropped_media_samples, latest_media_samples, media_capabilities, media_equalizer,
195    media_equalizer_bands, media_playback_supported, media_player, media_volume,
196    observe_audio_focus, observe_media_commands, observe_media_samples, observe_playback_progress,
197    observe_playback_state, octave_equalizer_bands, open_media, open_media_source, path_from_uri,
198    pause_media, play_media, playback_progress, playback_state, probe_media_duration,
199    publish_audio_focus, publish_media_command, publish_media_samples, publish_playback_progress,
200    publish_playback_state, record_dropped_media_samples, rememberAudioFocus,
201    rememberMediaCommands, rememberMediaSamples, rememberPlaybackProgress, rememberPlaybackState,
202    seek_media, seek_media_fraction, set_media_analysis_enabled, set_media_balance,
203    set_media_equalizer, set_media_looping, set_media_metadata, set_media_speed, set_media_volume,
204    set_platform_media_player, set_platform_media_source_opener, stop_media, toggle_media,
205    uri_for_path,
206};
207pub use memory_pressure::{
208    MemoryPressure, MemoryPressureObserver, observe_memory_pressure, publish_memory_pressure,
209    rememberMemoryPressure,
210};
211pub use microphone_permission::{
212    MicrophoneAccess, MicrophonePermission, MicrophonePermissionObserver, microphone_permission,
213    observe_microphone_permission, open_microphone_settings, prepare_microphone,
214    publish_microphone_permission, rememberMicrophonePermission, request_microphone_permission,
215    set_platform_microphone_access,
216};
217pub use microphone_standby::{
218    MicrophoneStandby, MicrophoneStandbyLease, hold_microphone_standby,
219    microphone_standby_available, set_platform_microphone_standby,
220};
221pub use navigation::{
222    BackHandler, BackRequestObserver, back_interception_enabled, exit_requested,
223    observe_back_requests, push_back_request, request_exit, set_back_interception,
224    take_back_requests, take_exit_request,
225};
226pub use network_status::{
227    NetworkMonitor, NetworkMonitorRef, NetworkStatus, clear_platform_network_monitor,
228    network_monitor, network_status, set_platform_network_monitor,
229};
230pub use notifier::{
231    Notifier, NotifierRef, NotifyRequest, ProvideNotifier, clear_platform_notifier,
232    default_notifier, local_notifier, push_notification_deeplink, set_platform_notifier,
233    take_notification_deeplink,
234};
235#[cfg(not(target_arch = "wasm32"))]
236pub use peer::{
237    ByteSource, BytesSource, FetchResult, PeerError, PeerServer, SourceResolver, content_length,
238    fetch_range, fetch_to_writer,
239};
240pub use power::{
241    BatteryStatus, PowerCapabilities, PowerMonitor, PowerMonitorRef, PowerObserverRegistration,
242    PowerReading, PowerState, ThermalState, clear_platform_power_monitor, observe_power_state,
243    power_capabilities, power_monitor, power_state, publish_power_state, rememberPowerState,
244    set_platform_power_monitor,
245};
246#[cfg(all(target_arch = "wasm32", feature = "preferences-web"))]
247pub use preferences::BrowserPreferences;
248#[cfg(not(target_arch = "wasm32"))]
249pub use preferences::FilePreferences;
250pub use preferences::{
251    MemoryPreferences, PreferencesError, PreferencesRef, PreferencesStore, Saver,
252    clear_platform_preferences, preferences, rememberSaveable, set_platform_preferences,
253};
254pub use purchases::{
255    Product, PurchaseEvent, Purchases, PurchasesRef, StoreObserver, StorePhase, StoreState,
256    clear_platform_purchases, note_store_news, observe_store_news, purchases,
257    rememberPurchaseEvents, rememberStoreState, set_platform_purchases, store_available,
258    store_state,
259};
260pub use share_sheet::{
261    ProvideShareSheet, ShareContent, ShareError, ShareSheet, ShareSheetRef,
262    clear_platform_share_sheet, default_share_sheet, local_share_sheet, set_platform_share_sheet,
263};
264pub use storage::{StorageSpace, StorageSpaceRef, available_storage, set_platform_storage_space};
265pub use theme::{
266    ProvideSystemTheme, SystemTheme, clear_platform_system_theme, default_system_theme,
267    isSystemInDarkTheme, local_system_theme, set_platform_system_theme,
268};
269pub use uri_handler::{
270    ProvideUriHandler, UriHandler, UriHandlerError, UriHandlerRef, clear_platform_uri_handler,
271    default_uri_handler, local_uri_handler, set_platform_uri_handler,
272};
273pub use wearable::{
274    WearableError, WearableEvent, WearableLink, WearablePeer, WearableReceiver, WearableStream,
275    open_on_wearable_peer, open_wearable_stream, publish_wearable_event, send_wearable_message,
276    set_platform_wearable_link, set_wearable_receiver, wearable_peers,
277};
278pub use wearable_framed::{FramedWearableLink, WearableTransport};
279pub use writable_folder::{
280    FolderEntry, FolderError, FolderReader, FolderWriter, WritableFolderStore,
281    WritableFolderStoreRef, open_writable_folder, set_writable_folder_store_factory,
282};
283
284#[cfg(test)]
285pub(crate) type TestComposition = Composition<MemoryApplier>;
286
287#[cfg(test)]
288pub(crate) fn test_scratch_dir(tag: &str) -> std::path::PathBuf {
289    cranpose_core::test_scratch_dir(env!("CARGO_MANIFEST_DIR"), tag)
290}
291
292#[cfg(test)]
293pub(crate) fn run_test_composition(build: impl FnMut()) -> TestComposition {
294    let mut composition = Composition::new(MemoryApplier::new());
295    composition
296        .render(location_key(file!(), line!(), column!()), build)
297        .expect("initial render succeeds");
298    composition
299}
300
301/// What a composable read while a test composition ran once, or `None` when
302/// the read never ran.
303#[cfg(test)]
304pub(crate) fn captured_in_composition<T: Copy + 'static>(
305    read: impl Fn() -> T + 'static,
306) -> Option<T> {
307    let captured = std::rc::Rc::new(std::cell::Cell::new(None));
308    let sink = std::rc::Rc::clone(&captured);
309    run_test_composition(move || sink.set(Some(read())));
310    captured.get()
311}