virtualization_rs/virtualization/
boot_loader.rs1use crate::base::{Id, NSString, NSURL};
3
4use objc::rc::StrongPtr;
5use objc::{class, msg_send, sel, sel_impl};
6
7pub trait VZBootLoader {
9 fn id(&self) -> Id;
10}
11
12pub struct VZLinuxBootLoaderBuilder<KernelURL, InitialRamdiskURL, CommandLine> {
22 kernel_url: KernelURL,
23 initial_ramdisk_url: InitialRamdiskURL,
24 command_line: CommandLine,
25}
26
27impl VZLinuxBootLoaderBuilder<(), (), ()> {
28 pub fn new() -> Self {
29 VZLinuxBootLoaderBuilder {
30 kernel_url: (),
31 initial_ramdisk_url: (),
32 command_line: (),
33 }
34 }
35}
36
37impl<KernelURL, InitialRamdiskURL, CommandLine>
38 VZLinuxBootLoaderBuilder<KernelURL, InitialRamdiskURL, CommandLine>
39{
40 pub fn kernel_url<T: Into<String>>(
41 self,
42 kernel_url: T,
43 ) -> VZLinuxBootLoaderBuilder<String, InitialRamdiskURL, CommandLine> {
44 VZLinuxBootLoaderBuilder {
45 kernel_url: kernel_url.into(),
46 initial_ramdisk_url: self.initial_ramdisk_url,
47 command_line: self.command_line,
48 }
49 }
50
51 pub fn initial_ramdisk_url<T: Into<String>>(
52 self,
53 initial_ramdisk_url: T,
54 ) -> VZLinuxBootLoaderBuilder<KernelURL, String, CommandLine> {
55 VZLinuxBootLoaderBuilder {
56 kernel_url: self.kernel_url,
57 initial_ramdisk_url: initial_ramdisk_url.into(),
58 command_line: self.command_line,
59 }
60 }
61
62 pub fn command_line<T: Into<String>>(
63 self,
64 command_line: T,
65 ) -> VZLinuxBootLoaderBuilder<KernelURL, InitialRamdiskURL, String> {
66 VZLinuxBootLoaderBuilder {
67 kernel_url: self.kernel_url,
68 initial_ramdisk_url: self.initial_ramdisk_url,
69 command_line: command_line.into(),
70 }
71 }
72}
73
74impl VZLinuxBootLoaderBuilder<String, String, String> {
75 pub fn build(self) -> VZLinuxBootLoader {
76 unsafe {
77 VZLinuxBootLoader::new(
78 self.kernel_url.as_str(),
79 self.initial_ramdisk_url.as_str(),
80 self.command_line.as_str(),
81 )
82 }
83 }
84}
85
86pub struct VZLinuxBootLoader(StrongPtr);
88
89impl VZLinuxBootLoader {
90 unsafe fn new(
91 kernel_url: &str,
92 initial_ramdisk_url: &str,
93 command_line: &str,
94 ) -> VZLinuxBootLoader {
95 let kernel_url_nsurl = NSURL::file_url_with_path(kernel_url, false).absolute_url();
96 let initial_ramdisk_url_nsurl =
97 NSURL::file_url_with_path(initial_ramdisk_url, false).absolute_url();
98 let command_line_nsstring = NSString::new(command_line);
99 let p = StrongPtr::new(msg_send![class!(VZLinuxBootLoader), new]);
100 let _: Id = msg_send![*p, setKernelURL: *kernel_url_nsurl.0];
101 let _: Id = msg_send![*p, setInitialRamdiskURL: *initial_ramdisk_url_nsurl.0];
102 let _: Id = msg_send![*p, setCommandLine: *command_line_nsstring.0];
103 VZLinuxBootLoader(p)
104 }
105}
106
107impl VZBootLoader for VZLinuxBootLoader {
108 fn id(&self) -> Id {
109 *self.0
110 }
111}