diff options
author | Bartek IwaĆczuk <biwanczuk@gmail.com> | 2019-11-07 17:11:15 +0100 |
---|---|---|
committer | Ry Dahl <ry@tinyclouds.org> | 2019-11-07 11:11:15 -0500 |
commit | 25c276055b3dfdcecd77d18a0c6ebfcee531442d (patch) | |
tree | f15f6170b6e9d966a9188f74bfb3e5bec45a3512 /cli/ops/files.rs | |
parent | 415d4c2e5236f6d8dfef8865b1665f144c39a019 (diff) |
refactor: remove cli::resources::Resource (#3285)
Diffstat (limited to 'cli/ops/files.rs')
-rw-r--r-- | cli/ops/files.rs | 55 |
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)) |