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