1pub mod command;
2pub mod command_handler;
3pub mod config;
4pub mod config_storage;
5pub mod image;
6pub mod launcher;
7#[allow(dead_code)]
8pub mod network;
9pub mod qmp;
10pub mod supervisor;
11pub mod template;
12pub mod traits;
13pub mod util;
14pub mod vm;
15
16use self::{
17    command::{CommandType, Commands, ConfigPortSubcommand, ConfigSubcommand, SnapshotSubcommand},
18    command_handler::CommandHandler,
19};
20use anyhow::Result;
21use clap::Parser;
22
23pub async fn evaluate() -> Result<()> {
24    let handler = CommandHandler::default();
25    let args = Commands::parse();
26
27    match args.command {
28        CommandType::Restart { name } => handler.restart(&name.into()),
29        CommandType::Reset { name } => handler.reset(&name.into()),
30        CommandType::Save { name } => handler.save_state(&name.into()),
31        CommandType::Load { name } => handler.load_state(&name.into()),
32        CommandType::ClearState { name } => handler.clear_state(&name.into()),
33        CommandType::Snapshot(sub) => match sub {
34            SnapshotSubcommand::Save {
35                name,
36                snapshot_name,
37            } => handler.snapshot_save(&name.into(), snapshot_name),
38            SnapshotSubcommand::Load {
39                name,
40                snapshot_name,
41            } => handler.snapshot_load(&name.into(), snapshot_name),
42            SnapshotSubcommand::Delete {
43                name,
44                snapshot_name,
45            } => handler.snapshot_delete(&name.into(), snapshot_name),
46        },
47        CommandType::Config(sub) => match sub {
48            ConfigSubcommand::Set { name, key, value } => {
49                handler.config_set(&name.into(), key, value)
50            }
51            ConfigSubcommand::Copy { from, to } => handler.config_copy(&from.into(), &to.into()),
52            ConfigSubcommand::Show { name } => handler.show_config(&name.into()),
53            ConfigSubcommand::Port(sub) => match sub {
54                ConfigPortSubcommand::Map {
55                    name,
56                    hostport,
57                    guestport,
58                } => handler.port_map(&name.into(), hostport, guestport),
59                ConfigPortSubcommand::Unmap { name, hostport } => {
60                    handler.port_unmap(&name.into(), hostport)
61                }
62            },
63        },
64        CommandType::ListDisks { name } => handler.list_disks(&name.into()),
65        CommandType::NC { name, port } => handler.nc(&name.into(), port).await,
66        CommandType::SSH { name, args } => handler.ssh(&name.into(), args),
67        CommandType::Create { append, name, size } => handler.create(&name.into(), size, append),
68        CommandType::Rename { old, new } => handler.rename(&old.into(), &new.into()),
69        CommandType::Delete { name, disk } => handler.delete(&name.into(), disk),
70        CommandType::Supervise { cdrom, name } => {
71            let mut vm: vm::VM = name.into();
72            if let Some(cdrom) = cdrom {
73                vm.set_cdrom(cdrom)
74            }
75            handler.supervise(&vm)
76        }
77        CommandType::Unsupervise { name } => handler.unsupervise(&name.into()),
78        CommandType::Run {
79            headless,
80            detach,
81            cdrom,
82            extra_disk,
83            name,
84        } => {
85            let mut vm: vm::VM = name.into();
86            vm.set_headless(headless);
87            if let Some(cdrom) = cdrom {
88                vm.set_cdrom(cdrom);
89            }
90            if let Some(extra_disk) = extra_disk {
91                vm.set_extra_disk(extra_disk)
92            }
93
94            handler.run(&vm, detach)
95        }
96        CommandType::List { running } => handler.list(running),
97        CommandType::Shutdown { name, nowait } => handler.shutdown(&name.into(), nowait),
98        CommandType::QMP {
99            name,
100            command,
101            arguments,
102        } => handler.qmp(&name.into(), &command, arguments.as_deref()),
103        CommandType::Supervised => handler.supervised(),
104        CommandType::Clone { from, to, config } => {
105            handler.clone_vm(&from.into(), &to.into(), config)
106        }
107        CommandType::Import {
108            format,
109            name,
110            from_file,
111        } => handler.import(&name.into(), from_file, format),
112        CommandType::IsActive { name } => handler.is_active(&name.into()),
113    }
114}