virtualization_rs/virtualization/
boot_loader.rs

1//! boot loader module
2use crate::base::{Id, NSString, NSURL};
3
4use objc::rc::StrongPtr;
5use objc::{class, msg_send, sel, sel_impl};
6
7/// common behaviors for booting
8pub trait VZBootLoader {
9    fn id(&self) -> Id;
10}
11
12/// builder for VZLinuxBootLoader
13/// # Examples
14/// ```rust
15/// let boot_loader = VZLinuxBootLoaderBuilder::new()
16///     .kernel_url(kernel_url)
17///     .initial_ramdisk_url(initial_ramdisk_url)
18///     .command_line(command_line)
19///     .build();
20/// ```
21pub 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
86///  bootLoader for Linux kernel
87pub 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}