summaryrefslogtreecommitdiff
path: root/vendor/security-framework/src/base.rs
diff options
context:
space:
mode:
authormo khan <mo@mokhan.ca>2025-07-10 13:11:11 -0600
committermo khan <mo@mokhan.ca>2025-07-10 13:11:11 -0600
commit01959b16a21b22b5df5f16569c2a8e8f92beecef (patch)
tree32afa5d747c5466345c59ec52161a7cba3d6d755 /vendor/security-framework/src/base.rs
parentff30574117a996df332e23d1fb6f65259b316b5b (diff)
chore: vendor dependencies
Diffstat (limited to 'vendor/security-framework/src/base.rs')
-rw-r--r--vendor/security-framework/src/base.rs88
1 files changed, 88 insertions, 0 deletions
diff --git a/vendor/security-framework/src/base.rs b/vendor/security-framework/src/base.rs
new file mode 100644
index 00000000..e790d95c
--- /dev/null
+++ b/vendor/security-framework/src/base.rs
@@ -0,0 +1,88 @@
+//! Support types for other modules.
+
+use core_foundation::string::CFString;
+use core_foundation_sys::base::OSStatus;
+use std::error;
+use std::fmt;
+use std::num::NonZeroI32;
+use std::result;
+
+/// A `Result` type commonly returned by functions.
+pub type Result<T, E = Error> = result::Result<T, E>;
+
+/// A Security Framework error.
+#[derive(Copy, Clone)]
+pub struct Error(NonZeroI32);
+
+impl fmt::Debug for Error {
+ #[cold]
+ fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
+ let mut builder = fmt.debug_struct("Error");
+ builder.field("code", &self.0);
+ if let Some(message) = self.message() {
+ builder.field("message", &message);
+ }
+ builder.finish()
+ }
+}
+
+impl Error {
+ /// Creates a new `Error` from a status code.
+ /// The code must not be zero
+ #[inline]
+ #[must_use]
+ pub fn from_code(code: OSStatus) -> Self {
+ Self(NonZeroI32::new(code).unwrap_or_else(|| NonZeroI32::new(1).unwrap()))
+ }
+
+ /// Returns a string describing the current error, if available.
+ #[inline(always)]
+ #[must_use]
+ pub fn message(self) -> Option<String> {
+ self.inner_message()
+ }
+
+ #[cold]
+ fn inner_message(self) -> Option<String> {
+ use core_foundation::base::TCFType;
+ use security_framework_sys::base::SecCopyErrorMessageString;
+ use std::ptr;
+
+ unsafe {
+ let s = SecCopyErrorMessageString(self.code(), ptr::null_mut());
+ if s.is_null() {
+ None
+ } else {
+ Some(CFString::wrap_under_create_rule(s).to_string())
+ }
+ }
+ }
+
+ /// Returns the code of the current error.
+ #[inline(always)]
+ #[must_use]
+ pub fn code(self) -> OSStatus {
+ self.0.get() as _
+ }
+}
+
+impl From<OSStatus> for Error {
+ #[inline(always)]
+ #[must_use]
+ fn from(code: OSStatus) -> Self {
+ Self::from_code(code)
+ }
+}
+
+impl fmt::Display for Error {
+ #[cold]
+ fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
+ if let Some(message) = self.message() {
+ write!(fmt, "{message}")
+ } else {
+ write!(fmt, "error code {}", self.code())
+ }
+ }
+}
+
+impl error::Error for Error {}