summaryrefslogtreecommitdiff
path: root/cli/util
diff options
context:
space:
mode:
authorNathan Whitaker <17734409+nathanwhit@users.noreply.github.com>2024-05-09 13:49:10 -0700
committerGitHub <noreply@github.com>2024-05-09 13:49:10 -0700
commit19c0633a947f2ee28cc07b59c32322151779101d (patch)
treeab7983bf954cd109517f80b42bd3199eb27efaa4 /cli/util
parent439b3b8db97106be44bb5fde9573632c20ed4e95 (diff)
refactor(lsp): Have JS drive TSC event loop in LSP (#23565)
Diffstat (limited to 'cli/util')
-rw-r--r--cli/util/mod.rs1
-rw-r--r--cli/util/result.rs16
-rw-r--r--cli/util/v8.rs2
-rw-r--r--cli/util/v8/convert.rs57
4 files changed, 76 insertions, 0 deletions
diff --git a/cli/util/mod.rs b/cli/util/mod.rs
index 7e0e1bd37..c8155dc51 100644
--- a/cli/util/mod.rs
+++ b/cli/util/mod.rs
@@ -12,6 +12,7 @@ pub mod gitignore;
pub mod logger;
pub mod path;
pub mod progress_bar;
+pub mod result;
pub mod sync;
pub mod text_encoding;
pub mod time;
diff --git a/cli/util/result.rs b/cli/util/result.rs
new file mode 100644
index 000000000..3203d04eb
--- /dev/null
+++ b/cli/util/result.rs
@@ -0,0 +1,16 @@
+// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
+
+use std::convert::Infallible;
+
+pub trait InfallibleResultExt<T> {
+ fn unwrap_infallible(self) -> T;
+}
+
+impl<T> InfallibleResultExt<T> for Result<T, Infallible> {
+ fn unwrap_infallible(self) -> T {
+ match self {
+ Ok(value) => value,
+ Err(never) => match never {},
+ }
+ }
+}
diff --git a/cli/util/v8.rs b/cli/util/v8.rs
index a8ab2c3d0..fb16e67b7 100644
--- a/cli/util/v8.rs
+++ b/cli/util/v8.rs
@@ -1,5 +1,7 @@
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
+pub mod convert;
+
#[inline(always)]
pub fn get_v8_flags_from_env() -> Vec<String> {
std::env::var("DENO_V8_FLAGS")
diff --git a/cli/util/v8/convert.rs b/cli/util/v8/convert.rs
new file mode 100644
index 000000000..28107d901
--- /dev/null
+++ b/cli/util/v8/convert.rs
@@ -0,0 +1,57 @@
+// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
+
+use deno_core::v8;
+use deno_core::FromV8;
+use deno_core::ToV8;
+
+#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
+/// A wrapper type for `Option<T>` that (de)serializes `None` as `null`
+#[repr(transparent)]
+pub struct OptionNull<T>(pub Option<T>);
+
+impl<T> From<Option<T>> for OptionNull<T> {
+ fn from(option: Option<T>) -> Self {
+ Self(option)
+ }
+}
+
+impl<T> From<OptionNull<T>> for Option<T> {
+ fn from(value: OptionNull<T>) -> Self {
+ value.0
+ }
+}
+
+impl<'a, T> ToV8<'a> for OptionNull<T>
+where
+ T: ToV8<'a>,
+{
+ type Error = T::Error;
+
+ fn to_v8(
+ self,
+ scope: &mut v8::HandleScope<'a>,
+ ) -> Result<v8::Local<'a, v8::Value>, Self::Error> {
+ match self.0 {
+ Some(value) => value.to_v8(scope),
+ None => Ok(v8::null(scope).into()),
+ }
+ }
+}
+
+impl<'a, T> FromV8<'a> for OptionNull<T>
+where
+ T: FromV8<'a>,
+{
+ type Error = T::Error;
+
+ fn from_v8(
+ scope: &mut v8::HandleScope<'a>,
+ value: v8::Local<'a, v8::Value>,
+ ) -> Result<Self, Self::Error> {
+ if value.is_null() {
+ Ok(OptionNull(None))
+ } else {
+ T::from_v8(scope, value).map(|v| OptionNull(Some(v)))
+ }
+ }
+}