aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe/src/util
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-05-23 03:07:15 +0900
committernsfisis <nsfisis@gmail.com>2026-05-23 15:48:00 +0900
commite068a9d644fde6659a88accd55b3f1d0d9d7cf46 (patch)
treebb719a70eb8c840957a94a5601df8961055ceb0f /crates/shirabe/src/util
parent60eb89529c8af2e4477e0bb65ed9e0f2dc7d3dd7 (diff)
downloadphp-shirabe-e068a9d644fde6659a88accd55b3f1d0d9d7cf46.tar.gz
php-shirabe-e068a9d644fde6659a88accd55b3f1d0d9d7cf46.tar.zst
php-shirabe-e068a9d644fde6659a88accd55b3f1d0d9d7cf46.zip
refactor(promise): rewrite promise bodies to async/await
Mechanically convert promise-returning function bodies to async/await: resolve() returns the value directly, forwarding calls get .await, and simple .then chains become await sequences. Also collapse the installer double-Option (Result<Option<Option<PhpMixed>>> -> Result<Option<PhpMixed>>). Hard spots that depend on the Loop::wait / job-machine boundary (accept/reject orchestration, closures capturing &mut self, batch waits) are left intact and marked with TODO(phase-c-promise) for manual porting. The crate does not compile yet; traits still need #[async_trait]. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Diffstat (limited to 'crates/shirabe/src/util')
-rw-r--r--crates/shirabe/src/util/filesystem.rs7
-rw-r--r--crates/shirabe/src/util/sync_helper.rs30
2 files changed, 24 insertions, 13 deletions
diff --git a/crates/shirabe/src/util/filesystem.rs b/crates/shirabe/src/util/filesystem.rs
index 39b5e6b..1bf4673 100644
--- a/crates/shirabe/src/util/filesystem.rs
+++ b/crates/shirabe/src/util/filesystem.rs
@@ -135,9 +135,7 @@ impl Filesystem {
pub async fn remove_directory_async(&mut self, directory: &str) -> anyhow::Result<bool> {
let edge_case_result = self.remove_edge_cases(directory, true)?;
if let Some(r) = edge_case_result {
- return Ok(shirabe_external_packages::react::promise::resolve(Some(
- PhpMixed::Bool(r),
- )));
+ return Ok(r);
}
let cmd: Vec<String> = if Platform::is_windows() {
@@ -151,6 +149,9 @@ impl Filesystem {
vec!["rm".to_string(), "-rf".to_string(), directory.to_string()]
};
+ // TODO(phase-c-promise): execute_async is now async fn -> Result<Process>; the .then_boxed continuation that
+ // inspects the process result and flattens into a recursive removeDirectoryPhp fallback needs job-machine
+ // boundary design before it can become a flat await chain.
let promise = self.get_process().execute_async(
PhpMixed::List(
cmd.iter()
diff --git a/crates/shirabe/src/util/sync_helper.rs b/crates/shirabe/src/util/sync_helper.rs
index 6cf2467..4c48c5c 100644
--- a/crates/shirabe/src/util/sync_helper.rs
+++ b/crates/shirabe/src/util/sync_helper.rs
@@ -20,8 +20,8 @@ impl<'a> DownloaderOrManager<'a> {
prev_package: Option<&dyn PackageInterface>,
) -> Result<Option<PhpMixed>> {
match self {
- Self::Interface(d) => d.download3(package, path, prev_package),
- Self::Manager(d) => d.borrow().download(package, path, prev_package),
+ Self::Interface(d) => d.download3(package, path, prev_package).await,
+ Self::Manager(d) => d.borrow().download(package, path, prev_package).await,
}
}
@@ -33,8 +33,12 @@ impl<'a> DownloaderOrManager<'a> {
prev_package: Option<&dyn PackageInterface>,
) -> Result<Option<PhpMixed>> {
match self {
- Self::Interface(d) => d.prepare(r#type, package, path, prev_package),
- Self::Manager(d) => d.borrow().prepare(r#type, package, path, prev_package),
+ Self::Interface(d) => d.prepare(r#type, package, path, prev_package).await,
+ Self::Manager(d) => {
+ d.borrow()
+ .prepare(r#type, package, path, prev_package)
+ .await
+ }
}
}
@@ -44,8 +48,8 @@ impl<'a> DownloaderOrManager<'a> {
path: &str,
) -> Result<Option<PhpMixed>> {
match self {
- Self::Interface(d) => d.install2(package, path),
- Self::Manager(d) => d.borrow().install(package, path),
+ Self::Interface(d) => d.install2(package, path).await,
+ Self::Manager(d) => d.borrow().install(package, path).await,
}
}
@@ -56,8 +60,8 @@ impl<'a> DownloaderOrManager<'a> {
path: &str,
) -> Result<Option<PhpMixed>> {
match self {
- Self::Interface(d) => d.update(package, prev_package, path),
- Self::Manager(d) => d.borrow().update(package, prev_package, path),
+ Self::Interface(d) => d.update(package, prev_package, path).await,
+ Self::Manager(d) => d.borrow().update(package, prev_package, path).await,
}
}
@@ -69,8 +73,12 @@ impl<'a> DownloaderOrManager<'a> {
prev_package: Option<&dyn PackageInterface>,
) -> Result<Option<PhpMixed>> {
match self {
- Self::Interface(d) => d.cleanup(r#type, package, path, prev_package),
- Self::Manager(d) => d.borrow().cleanup(r#type, package, path, prev_package),
+ Self::Interface(d) => d.cleanup(r#type, package, path, prev_package).await,
+ Self::Manager(d) => {
+ d.borrow()
+ .cleanup(r#type, package, path, prev_package)
+ .await
+ }
}
}
}
@@ -78,6 +86,7 @@ impl<'a> DownloaderOrManager<'a> {
pub struct SyncHelper;
impl SyncHelper {
+ // TODO(phase-c-promise): synchronous wrapper driving now-async downloader calls via Self::await (loop.wait); needs async/loop boundary design.
pub fn download_and_install_package_sync(
r#loop: &std::rc::Rc<std::cell::RefCell<Loop>>,
downloader: DownloaderOrManager<'_>,
@@ -125,6 +134,7 @@ impl SyncHelper {
Ok(())
}
+ // TODO(phase-c-promise): loop-pump synchronous wait over a promise; driving mechanism needs design.
pub fn r#await(
r#loop: &std::rc::Rc<std::cell::RefCell<Loop>>,
promise: Option<Box<dyn PromiseInterface>>,