summaryrefslogtreecommitdiff
path: root/cli/resources.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/resources.rs
parent415d4c2e5236f6d8dfef8865b1665f144c39a019 (diff)
refactor: remove cli::resources::Resource (#3285)
Diffstat (limited to 'cli/resources.rs')
-rw-r--r--cli/resources.rs137
1 files changed, 19 insertions, 118 deletions
diff --git a/cli/resources.rs b/cli/resources.rs
index 3b070e06b..2e6306761 100644
--- a/cli/resources.rs
+++ b/cli/resources.rs
@@ -8,11 +8,10 @@
// descriptors". This module implements a global resource table. Ops (AKA
// handlers) look up resources by their integer id here.
-use crate::deno_error;
use crate::deno_error::bad_resource;
use crate::http_body::HttpBody;
use deno::ErrBox;
-pub use deno::Resource as CoreResource;
+pub use deno::Resource;
pub use deno::ResourceId;
use deno::ResourceTable;
@@ -21,8 +20,6 @@ use futures::Future;
use futures::Poll;
use reqwest::r#async::Decoder as ReqwestDecoder;
use std;
-use std::io::{Read, Seek, SeekFrom, Write};
-use std::net::Shutdown;
use std::process::ExitStatus;
use std::sync::Mutex;
use std::sync::MutexGuard;
@@ -66,7 +63,7 @@ lazy_static! {
}
// TODO: move listeners out of this enum and rename to `StreamResource`
-enum CliResource {
+pub enum CliResource {
Stdin(tokio::io::Stdin),
Stdout(tokio::fs::File),
Stderr(tokio::io::Stderr),
@@ -84,60 +81,21 @@ enum CliResource {
ChildStderr(tokio_process::ChildStderr),
}
-impl CoreResource for CliResource {}
+impl Resource for CliResource {}
pub fn lock_resource_table<'a>() -> MutexGuard<'a, ResourceTable> {
RESOURCE_TABLE.lock().unwrap()
}
-// Abstract async file interface.
-// Ideally in unix, if Resource represents an OS rid, it will be the same.
-#[derive(Clone, Debug)]
-pub struct Resource {
- pub rid: ResourceId,
-}
-
-impl Resource {
- // close(2) is done by dropping the value. Therefore we just need to remove
- // the resource from the RESOURCE_TABLE.
- pub fn close(&self) {
- let mut table = lock_resource_table();
- table.close(self.rid).unwrap();
- }
-
- pub fn shutdown(&mut self, how: Shutdown) -> Result<(), ErrBox> {
- let mut table = lock_resource_table();
- let repr = table
- .get_mut::<CliResource>(self.rid)
- .ok_or_else(bad_resource)?;
-
- match repr {
- CliResource::TcpStream(ref mut f) => {
- TcpStream::shutdown(f, how).map_err(ErrBox::from)
- }
- _ => Err(bad_resource()),
- }
- }
-}
-
-impl Read for Resource {
- fn read(&mut self, _buf: &mut [u8]) -> std::io::Result<usize> {
- unimplemented!();
- }
-}
-
/// `DenoAsyncRead` is the same as the `tokio_io::AsyncRead` trait
/// but uses an `ErrBox` error instead of `std::io:Error`
pub trait DenoAsyncRead {
fn poll_read(&mut self, buf: &mut [u8]) -> Poll<usize, ErrBox>;
}
-impl DenoAsyncRead for Resource {
+impl DenoAsyncRead for CliResource {
fn poll_read(&mut self, buf: &mut [u8]) -> Poll<usize, ErrBox> {
- let mut table = lock_resource_table();
- let repr = table.get_mut(self.rid).ok_or_else(bad_resource)?;
-
- let r = match repr {
+ let r = match self {
CliResource::FsFile(ref mut f) => f.poll_read(buf),
CliResource::Stdin(ref mut f) => f.poll_read(buf),
CliResource::TcpStream(ref mut f) => f.poll_read(buf),
@@ -155,16 +113,6 @@ impl DenoAsyncRead for Resource {
}
}
-impl Write for Resource {
- fn write(&mut self, _buf: &[u8]) -> std::io::Result<usize> {
- unimplemented!()
- }
-
- fn flush(&mut self) -> std::io::Result<()> {
- unimplemented!()
- }
-}
-
/// `DenoAsyncWrite` is the same as the `tokio_io::AsyncWrite` trait
/// but uses an `ErrBox` error instead of `std::io:Error`
pub trait DenoAsyncWrite {
@@ -173,14 +121,9 @@ pub trait DenoAsyncWrite {
fn shutdown(&mut self) -> Poll<(), ErrBox>;
}
-impl DenoAsyncWrite for Resource {
+impl DenoAsyncWrite for CliResource {
fn poll_write(&mut self, buf: &[u8]) -> Poll<usize, ErrBox> {
- let mut table = lock_resource_table();
- let repr = table
- .get_mut::<CliResource>(self.rid)
- .ok_or_else(bad_resource)?;
-
- let r = match repr {
+ let r = match self {
CliResource::FsFile(ref mut f) => f.poll_write(buf),
CliResource::Stdout(ref mut f) => f.poll_write(buf),
CliResource::Stderr(ref mut f) => f.poll_write(buf),
@@ -201,41 +144,36 @@ impl DenoAsyncWrite for Resource {
}
}
-pub fn add_fs_file(fs_file: tokio::fs::File) -> Resource {
+pub fn add_fs_file(fs_file: tokio::fs::File) -> ResourceId {
let mut table = lock_resource_table();
- let rid = table.add("fsFile", Box::new(CliResource::FsFile(fs_file)));
- Resource { rid }
+ table.add("fsFile", Box::new(CliResource::FsFile(fs_file)))
}
-pub fn add_tcp_stream(stream: tokio::net::TcpStream) -> Resource {
+pub fn add_tcp_stream(stream: tokio::net::TcpStream) -> ResourceId {
let mut table = lock_resource_table();
- let rid = table.add("tcpStream", Box::new(CliResource::TcpStream(stream)));
- Resource { rid }
+ table.add("tcpStream", Box::new(CliResource::TcpStream(stream)))
}
-pub fn add_tls_stream(stream: ClientTlsStream<TcpStream>) -> Resource {
+pub fn add_tls_stream(stream: ClientTlsStream<TcpStream>) -> ResourceId {
let mut table = lock_resource_table();
- let rid = table.add(
+ table.add(
"clientTlsStream",
Box::new(CliResource::ClientTlsStream(Box::new(stream))),
- );
- Resource { rid }
+ )
}
-pub fn add_server_tls_stream(stream: ServerTlsStream<TcpStream>) -> Resource {
+pub fn add_server_tls_stream(stream: ServerTlsStream<TcpStream>) -> ResourceId {
let mut table = lock_resource_table();
- let rid = table.add(
+ table.add(
"serverTlsStream",
Box::new(CliResource::ServerTlsStream(Box::new(stream))),
- );
- Resource { rid }
+ )
}
-pub fn add_reqwest_body(body: ReqwestDecoder) -> Resource {
+pub fn add_reqwest_body(body: ReqwestDecoder) -> ResourceId {
let body = HttpBody::from(body);
let mut table = lock_resource_table();
- let rid = table.add("httpBody", Box::new(CliResource::HttpBody(body)));
- Resource { rid }
+ table.add("httpBody", Box::new(CliResource::HttpBody(body)))
}
pub struct ChildResources {
@@ -347,40 +285,3 @@ pub fn get_file(rid: ResourceId) -> Result<std::fs::File, ErrBox> {
_ => Err(bad_resource()),
}
}
-
-pub fn lookup(rid: ResourceId) -> Result<Resource, ErrBox> {
- debug!("resource lookup {}", rid);
- let table = lock_resource_table();
- let _ = table.get::<CliResource>(rid).ok_or_else(bad_resource)?;
- Ok(Resource { rid })
-}
-
-pub fn seek(
- resource: Resource,
- offset: i32,
- whence: u32,
-) -> Box<dyn Future<Item = (), Error = ErrBox> + Send> {
- // 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 Box::new(futures::future::err(
- deno_error::DenoError::new(
- deno_error::ErrorKind::InvalidSeekMode,
- format!("Invalid seek mode: {}", whence),
- )
- .into(),
- ));
- }
- };
-
- match get_file(resource.rid) {
- Ok(mut file) => Box::new(futures::future::lazy(move || {
- let result = file.seek(seek_from).map(|_| {}).map_err(ErrBox::from);
- futures::future::result(result)
- })),
- Err(err) => Box::new(futures::future::err(err)),
- }
-}