diff options
Diffstat (limited to 'cli/ops/files.rs')
-rw-r--r-- | cli/ops/files.rs | 98 |
1 files changed, 52 insertions, 46 deletions
diff --git a/cli/ops/files.rs b/cli/ops/files.rs index 023bd65f9..c02a69b9c 100644 --- a/cli/ops/files.rs +++ b/cli/ops/files.rs @@ -1,5 +1,6 @@ // Copyright 2018-2019 the Deno authors. All rights reserved. MIT license. use super::dispatch_flatbuffers::serialize_response; +use super::dispatch_json::{Deserialize, JsonOp, Value}; use super::utils::*; use crate::deno_error; use crate::fs as deno_fs; @@ -14,17 +15,22 @@ use std; use std::convert::From; use tokio; +#[derive(Deserialize)] +#[serde(rename_all = "camelCase")] +struct OpenArgs { + promise_id: Option<u64>, + filename: String, + mode: String, +} + pub fn op_open( state: &ThreadSafeState, - base: &msg::Base<'_>, - data: Option<PinnedBuf>, -) -> CliOpResult { - assert!(data.is_none()); - let cmd_id = base.cmd_id(); - let inner = base.inner_as_open().unwrap(); - let (filename, filename_) = - deno_fs::resolve_from_cwd(inner.filename().unwrap())?; - let mode = inner.mode().unwrap(); + args: Value, + _zero_copy: Option<PinnedBuf>, +) -> Result<JsonOp, ErrBox> { + let args: OpenArgs = serde_json::from_value(args)?; + let (filename, filename_) = deno_fs::resolve_from_cwd(&args.filename)?; + let mode = args.mode.as_ref(); let mut open_options = tokio::fs::OpenOptions::new(); @@ -75,44 +81,39 @@ pub 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); - let builder = &mut FlatBufferBuilder::new(); - let inner = - msg::OpenRes::create(builder, &msg::OpenResArgs { rid: resource.rid }); - Ok(serialize_response( - cmd_id, - builder, - msg::BaseArgs { - inner: Some(inner.as_union_value()), - inner_type: msg::Any::OpenRes, - ..Default::default() - }, - )) + futures::future::ok(json!(resource.rid)) }, ); - if base.sync() { + + if is_sync { let buf = op.wait()?; - Ok(Op::Sync(buf)) + Ok(JsonOp::Sync(buf)) } else { - Ok(Op::Async(Box::new(op))) + Ok(JsonOp::Async(Box::new(op))) } } +#[derive(Deserialize)] +struct CloseArgs { + rid: i32, +} + pub fn op_close( _state: &ThreadSafeState, - base: &msg::Base<'_>, - data: Option<PinnedBuf>, -) -> CliOpResult { - assert!(data.is_none()); - let inner = base.inner_as_close().unwrap(); - let rid = inner.rid(); - match resources::lookup(rid) { + args: Value, + _zero_copy: Option<PinnedBuf>, +) -> Result<JsonOp, ErrBox> { + let args: CloseArgs = serde_json::from_value(args)?; + + match resources::lookup(args.rid as u32) { None => Err(deno_error::bad_resource()), Some(resource) => { resource.close(); - ok_buf(empty_buf()) + Ok(JsonOp::Sync(json!({}))) } } } @@ -202,27 +203,32 @@ pub fn op_write( } } +#[derive(Deserialize)] +#[serde(rename_all = "camelCase")] +struct SeekArgs { + promise_id: Option<u64>, + rid: i32, + offset: i32, + whence: i32, +} + pub fn op_seek( _state: &ThreadSafeState, - base: &msg::Base<'_>, - data: Option<PinnedBuf>, -) -> CliOpResult { - assert!(data.is_none()); - let inner = base.inner_as_seek().unwrap(); - let rid = inner.rid(); - let offset = inner.offset(); - let whence = inner.whence(); + args: Value, + _zero_copy: Option<PinnedBuf>, +) -> Result<JsonOp, ErrBox> { + let args: SeekArgs = serde_json::from_value(args)?; - match resources::lookup(rid) { + match resources::lookup(args.rid as u32) { None => Err(deno_error::bad_resource()), Some(resource) => { - let op = resources::seek(resource, offset, whence) - .and_then(move |_| Ok(empty_buf())); - if base.sync() { + let op = resources::seek(resource, args.offset, args.whence as u32) + .and_then(move |_| futures::future::ok(json!({}))); + if args.promise_id.is_none() { let buf = op.wait()?; - Ok(Op::Sync(buf)) + Ok(JsonOp::Sync(buf)) } else { - Ok(Op::Async(Box::new(op))) + Ok(JsonOp::Async(Box::new(op))) } } } |