summaryrefslogtreecommitdiff
path: root/cli/ops/files.rs
diff options
context:
space:
mode:
authorBartek IwaƄczuk <biwanczuk@gmail.com>2019-11-07 17:11:15 +0100
committerRy Dahl <ry@tinyclouds.org>2019-11-07 11:11:15 -0500
commit25c276055b3dfdcecd77d18a0c6ebfcee531442d (patch)
treef15f6170b6e9d966a9188f74bfb3e5bec45a3512 /cli/ops/files.rs
parent415d4c2e5236f6d8dfef8865b1665f144c39a019 (diff)
refactor: remove cli::resources::Resource (#3285)
Diffstat (limited to 'cli/ops/files.rs')
-rw-r--r--cli/ops/files.rs55
1 files changed, 50 insertions, 5 deletions
diff --git a/cli/ops/files.rs b/cli/ops/files.rs
index c1e43ff95..04b5f98bf 100644
--- a/cli/ops/files.rs
+++ b/cli/ops/files.rs
@@ -1,14 +1,19 @@
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
use super::dispatch_json::{Deserialize, JsonOp, Value};
use crate::deno_error::bad_resource;
+use crate::deno_error::DenoError;
+use crate::deno_error::ErrorKind;
use crate::fs as deno_fs;
use crate::ops::json_op;
use crate::resources;
+use crate::resources::CliResource;
use crate::state::ThreadSafeState;
use deno::*;
use futures::Future;
+use futures::Poll;
use std;
use std::convert::From;
+use std::io::SeekFrom;
use tokio;
pub fn init(i: &mut Isolate, s: &ThreadSafeState) {
@@ -86,8 +91,8 @@ fn op_open(
let is_sync = args.promise_id.is_none();
let op = open_options.open(filename).map_err(ErrBox::from).and_then(
move |fs_file| {
- let resource = resources::add_fs_file(fs_file);
- futures::future::ok(json!(resource.rid))
+ let rid = resources::add_fs_file(fs_file);
+ futures::future::ok(json!(rid))
},
);
@@ -116,6 +121,31 @@ fn op_close(
Ok(JsonOp::Sync(json!({})))
}
+#[derive(Debug)]
+pub struct SeekFuture {
+ seek_from: SeekFrom,
+ rid: ResourceId,
+}
+
+impl Future for SeekFuture {
+ type Item = u64;
+ type Error = ErrBox;
+
+ fn poll(&mut self) -> Poll<Self::Item, Self::Error> {
+ let mut table = resources::lock_resource_table();
+ let resource = table
+ .get_mut::<CliResource>(self.rid)
+ .ok_or_else(bad_resource)?;
+
+ let tokio_file = match resource {
+ CliResource::FsFile(ref mut file) => file,
+ _ => return Err(bad_resource()),
+ };
+
+ tokio_file.poll_seek(self.seek_from).map_err(ErrBox::from)
+ }
+}
+
#[derive(Deserialize)]
#[serde(rename_all = "camelCase")]
struct SeekArgs {
@@ -131,10 +161,25 @@ fn op_seek(
_zero_copy: Option<PinnedBuf>,
) -> Result<JsonOp, ErrBox> {
let args: SeekArgs = serde_json::from_value(args)?;
+ let rid = args.rid as u32;
+ let offset = args.offset;
+ let whence = args.whence as u32;
+ // Translate seek mode to Rust repr.
+ let seek_from = match whence {
+ 0 => SeekFrom::Start(offset as u64),
+ 1 => SeekFrom::Current(i64::from(offset)),
+ 2 => SeekFrom::End(i64::from(offset)),
+ _ => {
+ return Err(ErrBox::from(DenoError::new(
+ ErrorKind::InvalidSeekMode,
+ format!("Invalid seek mode: {}", whence),
+ )));
+ }
+ };
+
+ let fut = SeekFuture { seek_from, rid };
- let resource = resources::lookup(args.rid as u32)?;
- let op = resources::seek(resource, args.offset, args.whence as u32)
- .and_then(move |_| futures::future::ok(json!({})));
+ let op = fut.and_then(move |_| futures::future::ok(json!({})));
if args.promise_id.is_none() {
let buf = op.wait()?;
Ok(JsonOp::Sync(buf))