virtualization_rs/virtualization/
serial_port.rs1use crate::base::{Id, NSFileHandle};
4
5use objc::rc::StrongPtr;
6use objc::{class, msg_send, sel, sel_impl};
7
8pub trait VZSerialPortAttachment {
10 fn id(&self) -> Id;
11}
12
13pub struct VZFileHandleSerialPortAttachmentBuilder<R, W> {
22 file_handle_for_reading: R,
23 file_handle_for_writing: W,
24}
25
26impl VZFileHandleSerialPortAttachmentBuilder<(), ()> {
27 pub fn new() -> Self {
28 VZFileHandleSerialPortAttachmentBuilder {
29 file_handle_for_reading: (),
30 file_handle_for_writing: (),
31 }
32 }
33}
34
35impl<R, W> VZFileHandleSerialPortAttachmentBuilder<R, W> {
36 pub fn file_handle_for_reading(
37 self,
38 file_handle_for_reading: NSFileHandle,
39 ) -> VZFileHandleSerialPortAttachmentBuilder<NSFileHandle, W> {
40 VZFileHandleSerialPortAttachmentBuilder {
41 file_handle_for_reading: file_handle_for_reading,
42 file_handle_for_writing: self.file_handle_for_writing,
43 }
44 }
45
46 pub fn file_handle_for_writing(
47 self,
48 file_handle_for_writing: NSFileHandle,
49 ) -> VZFileHandleSerialPortAttachmentBuilder<R, NSFileHandle> {
50 VZFileHandleSerialPortAttachmentBuilder {
51 file_handle_for_reading: self.file_handle_for_reading,
52 file_handle_for_writing: file_handle_for_writing,
53 }
54 }
55}
56
57impl VZFileHandleSerialPortAttachmentBuilder<NSFileHandle, NSFileHandle> {
58 pub fn build(self) -> VZFileHandleSerialPortAttachment {
59 unsafe {
60 VZFileHandleSerialPortAttachment::new(
61 self.file_handle_for_reading,
62 self.file_handle_for_writing,
63 )
64 }
65 }
66}
67
68pub struct VZFileHandleSerialPortAttachment(StrongPtr);
70
71impl VZFileHandleSerialPortAttachment {
72 unsafe fn new(
73 file_handle_for_reading: NSFileHandle,
74 file_handle_for_writing: NSFileHandle,
75 ) -> VZFileHandleSerialPortAttachment {
76 let i: Id = msg_send![class!(VZFileHandleSerialPortAttachment), new];
77 let p = StrongPtr::new(
78 msg_send![i, initWithFileHandleForReading:*file_handle_for_reading.0 fileHandleForWriting:*file_handle_for_writing.0],
79 );
80 VZFileHandleSerialPortAttachment(p)
81 }
82}
83
84impl VZSerialPortAttachment for VZFileHandleSerialPortAttachment {
85 fn id(&self) -> Id {
86 *self.0
87 }
88}
89
90pub trait VZSerialPortConfiguration {
92 fn id(&self) -> Id;
93}
94
95pub struct VZVirtioConsoleDeviceSerialPortConfiguration(StrongPtr);
97
98impl VZVirtioConsoleDeviceSerialPortConfiguration {
99 pub fn new<T: VZSerialPortAttachment>(
100 attachement: T,
101 ) -> VZVirtioConsoleDeviceSerialPortConfiguration {
102 unsafe {
103 let p = StrongPtr::new(msg_send![
104 class!(VZVirtioConsoleDeviceSerialPortConfiguration),
105 new
106 ]);
107 let _: Id = msg_send![*p, setAttachment: attachement.id()];
108 VZVirtioConsoleDeviceSerialPortConfiguration(p)
109 }
110 }
111}
112
113impl VZSerialPortConfiguration for VZVirtioConsoleDeviceSerialPortConfiguration {
114 fn id(&self) -> Id {
115 *self.0
116 }
117}