Skip to content

Commit f77e232

Browse files
committed
Cleanup client implementation
1 parent fc8c6de commit f77e232

1 file changed

Lines changed: 40 additions & 38 deletions

File tree

cli/src/client.rs

Lines changed: 40 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use std::{
55
fs,
66
io::{Cursor, ErrorKind},
77
iter::{self, Empty},
8-
path::Path,
8+
path::{Path, PathBuf},
99
process::{Output, Stdio},
1010
sync::Arc,
1111
time::Duration,
@@ -16,8 +16,8 @@ use clusterizer_client::result::ClientResult;
1616
use clusterizer_common::{
1717
errors::SubmitResultError,
1818
records::{
19-
Platform, PlatformFilter, Project, ProjectFilter, ProjectVersion, ProjectVersionFilter,
20-
Task,
19+
File, FileFilter, Platform, PlatformFilter, Project, ProjectFilter, ProjectVersion,
20+
ProjectVersionFilter, Task,
2121
},
2222
requests::{FetchTasksRequest, SubmitResultRequest},
2323
types::Id,
@@ -35,9 +35,9 @@ struct ClusterizerClient {
3535
}
3636

3737
struct TaskInfo {
38+
file: File,
39+
program_dir: PathBuf,
3840
task: Task,
39-
project: Project,
40-
project_version: ProjectVersion,
4141
}
4242

4343
enum Return {
@@ -92,24 +92,41 @@ impl ClusterizerClient {
9292

9393
async fn fetch_tasks(self: Arc<Self>) -> ClientResult<Return> {
9494
let tasks = loop {
95-
let mut projects: HashMap<_, _> = self
95+
let projects: HashMap<_, _> = self
9696
.client
97-
.get_all::<Project>(&ProjectFilter::default())
97+
.get_all::<Project>(&ProjectFilter::default().disabled(false))
9898
.await?
9999
.into_iter()
100100
.map(|project| (project.id, project))
101101
.collect();
102102

103-
let projects: HashMap<_, _> = self
103+
let project_versions: HashMap<_, _> = self
104104
.client
105105
.get_all::<ProjectVersion>(&ProjectVersionFilter::default().disabled(false))
106106
.await?
107107
.into_iter()
108108
.filter(|project_version| self.platform_ids.contains(&project_version.platform_id))
109-
.filter_map(|project_version| {
110-
projects
111-
.remove(&project_version.project_id)
112-
.map(|project| (project.id, (project, project_version)))
109+
.map(|project_version| (project_version.id, project_version))
110+
.collect();
111+
112+
let files: HashMap<_, _> = self
113+
.client
114+
.get_all::<File>(&FileFilter::default())
115+
.await?
116+
.into_iter()
117+
.filter(|file| {
118+
project_versions
119+
.clone()
120+
.into_iter()
121+
.any(|(_, project_version)| project_version.file_id == file.id)
122+
})
123+
.filter_map(|file| {
124+
for project_version in project_versions.values() {
125+
if project_version.file_id == file.id {
126+
return Some((project_version.project_id, file));
127+
}
128+
}
129+
None
113130
})
114131
.collect();
115132

@@ -122,13 +139,12 @@ impl ClusterizerClient {
122139
.await?
123140
.into_iter()
124141
.filter_map(|task| {
125-
let info = projects
126-
.get(&task.project_id)
127-
.map(|(project, project_version)| TaskInfo {
128-
task,
129-
project: project.clone(),
130-
project_version: project_version.clone(),
131-
});
142+
let file_path = self.args.cache_dir.join("bin");
143+
let info = files.get(&task.project_id).map(|file| TaskInfo {
144+
task,
145+
file: file.clone(),
146+
program_dir: file_path.clone().join(format!("{:x}", file)),
147+
});
132148

133149
if info.is_none() {
134150
warn!("Unwanted task received from server.");
@@ -147,14 +163,10 @@ impl ClusterizerClient {
147163
};
148164

149165
for TaskInfo {
150-
project_version, ..
166+
program_dir, file, ..
151167
} in &tasks
152168
{
153-
let file = self.client.get_one(project_version.file_id).await?;
154-
155-
let binary_dir = self.args.binaries_dir().join(format!("{:x}", file));
156-
157-
download_archive(&file.url, &binary_dir, &self.args.cache_dir).await?;
169+
download_archive(&file.url, program_dir, &self.args.cache_dir).await?;
158170
}
159171

160172
Ok(Return::FetchTasks(tasks))
@@ -163,26 +175,16 @@ impl ClusterizerClient {
163175
async fn execute_task(
164176
self: Arc<Self>,
165177
TaskInfo {
166-
task,
167-
project,
168-
project_version,
178+
task, program_dir, ..
169179
}: TaskInfo,
170180
) -> ClientResult<Return> {
171181
let slot_dir = tempfile::tempdir()?;
172182

173183
info!("Task id: {}, stdin: {}", task.id, task.stdin);
174-
info!("Project id: {}, name: {}", project.id, project.name);
175-
debug!(
176-
"Project version id: {}, file id: {}",
177-
project_version.id, project_version.file_id
178-
);
184+
info!("Project id: {}", task.project_id);
179185
debug!("Slot dir: {}", slot_dir.path().display());
180186

181-
let file = self.client.get_one(project_version.file_id).await?;
182-
183-
let project_version_dir = self.args.binaries_dir().join(format!("{:x}", file));
184-
185-
let program = project_version_dir
187+
let program = program_dir
186188
.join(format!("main{}", env::consts::EXE_SUFFIX))
187189
.canonicalize()?;
188190

0 commit comments

Comments
 (0)