diff --git a/pkg/macos/foundation.zig b/pkg/macos/foundation.zig index ce969293e..ed18b5dfd 100644 --- a/pkg/macos/foundation.zig +++ b/pkg/macos/foundation.zig @@ -3,6 +3,7 @@ pub usingnamespace @import("foundation/base.zig"); pub usingnamespace @import("foundation/dictionary.zig"); pub usingnamespace @import("foundation/string.zig"); pub usingnamespace @import("foundation/type.zig"); +pub usingnamespace @import("foundation/url.zig"); test { @import("std").testing.refAllDecls(@This()); diff --git a/pkg/macos/foundation/url.zig b/pkg/macos/foundation/url.zig new file mode 100644 index 000000000..3917beff3 --- /dev/null +++ b/pkg/macos/foundation/url.zig @@ -0,0 +1,47 @@ +const std = @import("std"); +const Allocator = std.mem.Allocator; +const foundation = @import("../foundation.zig"); + +pub const URL = opaque { + pub fn createWithString(str: *foundation.String, base: ?*URL) Allocator.Error!*URL { + return CFURLCreateWithString( + null, + str, + base, + ) orelse error.OutOfMemory; + } + + pub fn release(self: *URL) void { + foundation.CFRelease(self); + } + + pub fn copyPath(self: *URL) ?*foundation.String { + return CFURLCopyPath(self); + } + + pub extern "c" fn CFURLCreateWithString( + allocator: ?*anyopaque, + url_string: *const anyopaque, + base_url: ?*const anyopaque, + ) ?*URL; + pub extern "c" fn CFURLCopyPath(*URL) ?*foundation.String; +}; + +test { + const testing = std.testing; + + const str = try foundation.String.createWithBytes("http://www.example.com/foo", .utf8, false); + defer str.release(); + + const url = try URL.createWithString(str, null); + defer url.release(); + + { + const path = url.copyPath().?; + defer path.release(); + + var buf: [128]u8 = undefined; + const cstr = path.cstring(&buf, .utf8).?; + try testing.expectEqualStrings("/foo", cstr); + } +} diff --git a/pkg/macos/text/font_descriptor.zig b/pkg/macos/text/font_descriptor.zig index 17fd404c9..8e8ce33e5 100644 --- a/pkg/macos/text/font_descriptor.zig +++ b/pkg/macos/text/font_descriptor.zig @@ -83,7 +83,7 @@ pub const FontAttribute = enum { pub fn Value(self: FontAttribute) type { return switch (self) { - .url => *anyopaque, // CFUrl + .url => *foundation.URL, .name => *foundation.String, .display_name => *foundation.String, .family_name => *foundation.String,