pub struct LAEnvironmentMechanismCompanion { /* private fields */ }Expand description
Companion-device LAEnvironment mechanism details.
Implementations§
Source§impl LAEnvironmentMechanismCompanion
impl LAEnvironmentMechanismCompanion
Sourcepub fn is_usable(&self) -> Result<bool>
pub fn is_usable(&self) -> Result<bool>
Whether the mechanism is currently usable for authentication.
§Errors
Returns an error if the Swift bridge rejects the request.
Examples found in repository?
examples/10_environment.rs (line 61)
7fn main() -> Result<(), Box<dyn std::error::Error>> {
8 let environment = match LAEnvironment::current_user() {
9 Ok(environment) => environment,
10 Err(error) => {
11 println!("environment APIs require macOS 15+: {error}");
12 return Ok(());
13 }
14 };
15
16 let notifications = Arc::new(AtomicUsize::new(0));
17 let registration = environment.add_observer({
18 let notifications = Arc::clone(¬ifications);
19 move |environment: &LAEnvironment, old_state: &LAEnvironmentState| {
20 let current_count = environment
21 .state()
22 .and_then(|state| state.all_mechanisms().map(|items| items.len()))
23 .unwrap_or_default();
24 let previous_count = old_state
25 .all_mechanisms()
26 .map(|items| items.len())
27 .unwrap_or_default();
28 println!(
29 "environment changed: {previous_count} -> {current_count} mechanisms"
30 );
31 notifications.fetch_add(1, Ordering::Relaxed);
32 }
33 })?;
34
35 let state = environment.state()?;
36 println!("all mechanisms: {}", state.all_mechanisms()?.len());
37
38 if let Some(biometry) = state.biometry()? {
39 println!(
40 "biometry: {:?}, enrolled={}, usable={}, icon={}",
41 biometry.biometry_type()?,
42 biometry.is_enrolled()?,
43 biometry.is_usable()?,
44 biometry.icon_system_name()?
45 );
46 }
47
48 if let Some(user_password) = state.user_password()? {
49 println!(
50 "user password: set={}, usable={}, label={}",
51 user_password.is_set()?,
52 user_password.is_usable()?,
53 user_password.localized_name()?
54 );
55 }
56
57 for companion in state.companions()? {
58 println!(
59 "companion {:?}: usable={}, state-hash-bytes={}",
60 companion.companion_type()?,
61 companion.is_usable()?,
62 companion.state_hash()?.map_or(0, |hash| hash.len())
63 );
64 }
65
66 environment.remove_observer(®istration)?;
67 println!(
68 "observer notifications seen so far: {}",
69 notifications.load(Ordering::Relaxed)
70 );
71 println!("✅ environment smoke OK");
72 Ok(())
73}Sourcepub fn localized_name(&self) -> Result<String>
pub fn localized_name(&self) -> Result<String>
Localized display name such as Apple Watch.
§Errors
Returns an error if the Swift bridge rejects the request.
Sourcepub fn icon_system_name(&self) -> Result<String>
pub fn icon_system_name(&self) -> Result<String>
SF Symbol name representing this mechanism.
§Errors
Returns an error if the Swift bridge rejects the request.
Sourcepub fn companion_type(&self) -> Result<LACompanionType>
pub fn companion_type(&self) -> Result<LACompanionType>
Examples found in repository?
examples/10_environment.rs (line 60)
7fn main() -> Result<(), Box<dyn std::error::Error>> {
8 let environment = match LAEnvironment::current_user() {
9 Ok(environment) => environment,
10 Err(error) => {
11 println!("environment APIs require macOS 15+: {error}");
12 return Ok(());
13 }
14 };
15
16 let notifications = Arc::new(AtomicUsize::new(0));
17 let registration = environment.add_observer({
18 let notifications = Arc::clone(¬ifications);
19 move |environment: &LAEnvironment, old_state: &LAEnvironmentState| {
20 let current_count = environment
21 .state()
22 .and_then(|state| state.all_mechanisms().map(|items| items.len()))
23 .unwrap_or_default();
24 let previous_count = old_state
25 .all_mechanisms()
26 .map(|items| items.len())
27 .unwrap_or_default();
28 println!(
29 "environment changed: {previous_count} -> {current_count} mechanisms"
30 );
31 notifications.fetch_add(1, Ordering::Relaxed);
32 }
33 })?;
34
35 let state = environment.state()?;
36 println!("all mechanisms: {}", state.all_mechanisms()?.len());
37
38 if let Some(biometry) = state.biometry()? {
39 println!(
40 "biometry: {:?}, enrolled={}, usable={}, icon={}",
41 biometry.biometry_type()?,
42 biometry.is_enrolled()?,
43 biometry.is_usable()?,
44 biometry.icon_system_name()?
45 );
46 }
47
48 if let Some(user_password) = state.user_password()? {
49 println!(
50 "user password: set={}, usable={}, label={}",
51 user_password.is_set()?,
52 user_password.is_usable()?,
53 user_password.localized_name()?
54 );
55 }
56
57 for companion in state.companions()? {
58 println!(
59 "companion {:?}: usable={}, state-hash-bytes={}",
60 companion.companion_type()?,
61 companion.is_usable()?,
62 companion.state_hash()?.map_or(0, |hash| hash.len())
63 );
64 }
65
66 environment.remove_observer(®istration)?;
67 println!(
68 "observer notifications seen so far: {}",
69 notifications.load(Ordering::Relaxed)
70 );
71 println!("✅ environment smoke OK");
72 Ok(())
73}Sourcepub fn state_hash(&self) -> Result<Option<Vec<u8>>>
pub fn state_hash(&self) -> Result<Option<Vec<u8>>>
Pairing hash for the current companion type, if one exists.
§Errors
Returns an error if the Swift bridge rejects the request.
Examples found in repository?
examples/10_environment.rs (line 62)
7fn main() -> Result<(), Box<dyn std::error::Error>> {
8 let environment = match LAEnvironment::current_user() {
9 Ok(environment) => environment,
10 Err(error) => {
11 println!("environment APIs require macOS 15+: {error}");
12 return Ok(());
13 }
14 };
15
16 let notifications = Arc::new(AtomicUsize::new(0));
17 let registration = environment.add_observer({
18 let notifications = Arc::clone(¬ifications);
19 move |environment: &LAEnvironment, old_state: &LAEnvironmentState| {
20 let current_count = environment
21 .state()
22 .and_then(|state| state.all_mechanisms().map(|items| items.len()))
23 .unwrap_or_default();
24 let previous_count = old_state
25 .all_mechanisms()
26 .map(|items| items.len())
27 .unwrap_or_default();
28 println!(
29 "environment changed: {previous_count} -> {current_count} mechanisms"
30 );
31 notifications.fetch_add(1, Ordering::Relaxed);
32 }
33 })?;
34
35 let state = environment.state()?;
36 println!("all mechanisms: {}", state.all_mechanisms()?.len());
37
38 if let Some(biometry) = state.biometry()? {
39 println!(
40 "biometry: {:?}, enrolled={}, usable={}, icon={}",
41 biometry.biometry_type()?,
42 biometry.is_enrolled()?,
43 biometry.is_usable()?,
44 biometry.icon_system_name()?
45 );
46 }
47
48 if let Some(user_password) = state.user_password()? {
49 println!(
50 "user password: set={}, usable={}, label={}",
51 user_password.is_set()?,
52 user_password.is_usable()?,
53 user_password.localized_name()?
54 );
55 }
56
57 for companion in state.companions()? {
58 println!(
59 "companion {:?}: usable={}, state-hash-bytes={}",
60 companion.companion_type()?,
61 companion.is_usable()?,
62 companion.state_hash()?.map_or(0, |hash| hash.len())
63 );
64 }
65
66 environment.remove_observer(®istration)?;
67 println!(
68 "observer notifications seen so far: {}",
69 notifications.load(Ordering::Relaxed)
70 );
71 println!("✅ environment smoke OK");
72 Ok(())
73}Trait Implementations§
Auto Trait Implementations§
impl Freeze for LAEnvironmentMechanismCompanion
impl RefUnwindSafe for LAEnvironmentMechanismCompanion
impl !Send for LAEnvironmentMechanismCompanion
impl !Sync for LAEnvironmentMechanismCompanion
impl Unpin for LAEnvironmentMechanismCompanion
impl UnsafeUnpin for LAEnvironmentMechanismCompanion
impl UnwindSafe for LAEnvironmentMechanismCompanion
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more