pub struct LAEnvironmentState { /* private fields */ }Expand description
Snapshot wrapper around Apple’s LAEnvironmentState.
Implementations§
Source§impl LAEnvironmentState
impl LAEnvironmentState
Sourcepub fn biometry(&self) -> Result<Option<LAEnvironmentMechanismBiometry>>
pub fn biometry(&self) -> Result<Option<LAEnvironmentMechanismBiometry>>
Information about the device’s biometric mechanism, if supported.
§Errors
Returns an error if the Swift bridge rejects the request.
Examples found in repository?
examples/10_environment.rs (line 38)
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 user_password(
&self,
) -> Result<Option<LAEnvironmentMechanismUserPassword>>
pub fn user_password( &self, ) -> Result<Option<LAEnvironmentMechanismUserPassword>>
Information about the local user password or passcode mechanism, if supported.
§Errors
Returns an error if the Swift bridge rejects the request.
Examples found in repository?
examples/10_environment.rs (line 48)
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 companions(&self) -> Result<Vec<LAEnvironmentMechanismCompanion>>
pub fn companions(&self) -> Result<Vec<LAEnvironmentMechanismCompanion>>
Companion authentication mechanisms currently paired with this device.
§Errors
Returns an error if the Swift bridge rejects the request.
Examples found in repository?
examples/10_environment.rs (line 57)
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 all_mechanisms(&self) -> Result<Vec<LAEnvironmentMechanism>>
pub fn all_mechanisms(&self) -> Result<Vec<LAEnvironmentMechanism>>
Information about every currently known authentication mechanism.
§Errors
Returns an error if the Swift bridge rejects the request.
Examples found in repository?
examples/10_environment.rs (line 22)
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 LAEnvironmentState
impl RefUnwindSafe for LAEnvironmentState
impl !Send for LAEnvironmentState
impl !Sync for LAEnvironmentState
impl Unpin for LAEnvironmentState
impl UnsafeUnpin for LAEnvironmentState
impl UnwindSafe for LAEnvironmentState
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