aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-05-15 01:07:54 +0900
committernsfisis <nsfisis@gmail.com>2026-05-15 19:51:17 +0900
commitf78ade50822cee315c73b73f40f1a923a2bfd6ac (patch)
treea5fbc0aa34fb94fae68754278155a471e841c2a1
parentf419c7d4e2c500f980e9e44ac2f1eaa033be0314 (diff)
downloadphp-shirabe-f78ade50822cee315c73b73f40f1a923a2bfd6ac.tar.gz
php-shirabe-f78ade50822cee315c73b73f40f1a923a2bfd6ac.tar.zst
php-shirabe-f78ade50822cee315c73b73f40f1a923a2bfd6ac.zip
feat(port): port RepositoryInterface.php
-rw-r--r--crates/shirabe-php-shim/src/lib.rs4
-rw-r--r--crates/shirabe/src/repository/repository_interface.rs62
2 files changed, 66 insertions, 0 deletions
diff --git a/crates/shirabe-php-shim/src/lib.rs b/crates/shirabe-php-shim/src/lib.rs
index 68cf03a..1c16ded 100644
--- a/crates/shirabe-php-shim/src/lib.rs
+++ b/crates/shirabe-php-shim/src/lib.rs
@@ -348,6 +348,10 @@ pub trait JsonSerializable {
fn json_serialize(&self) -> PhpMixed;
}
+pub trait Countable {
+ fn count(&self) -> i64;
+}
+
pub fn in_array(needle: PhpMixed, haystack: &PhpMixed, strict: bool) -> bool {
todo!()
}
diff --git a/crates/shirabe/src/repository/repository_interface.rs b/crates/shirabe/src/repository/repository_interface.rs
index 6e60721..981ee77 100644
--- a/crates/shirabe/src/repository/repository_interface.rs
+++ b/crates/shirabe/src/repository/repository_interface.rs
@@ -1 +1,63 @@
//! ref: composer/src/Composer/Repository/RepositoryInterface.php
+
+use indexmap::IndexMap;
+use shirabe_php_shim::Countable;
+use shirabe_semver::constraint::constraint_interface::ConstraintInterface;
+use crate::package::base_package::BasePackage;
+use crate::package::package_interface::PackageInterface;
+
+pub enum FindPackageConstraint {
+ String(String),
+ Constraint(Box<dyn ConstraintInterface>),
+}
+
+pub struct LoadPackagesResult {
+ pub names_found: Vec<String>,
+ pub packages: Vec<Box<BasePackage>>,
+}
+
+pub enum AbandonedInfo {
+ Replacement(String),
+ Abandoned,
+}
+
+pub struct SearchResult {
+ pub name: String,
+ pub description: Option<String>,
+ pub abandoned: Option<AbandonedInfo>,
+ pub url: Option<String>,
+}
+
+pub struct ProviderInfo {
+ pub name: String,
+ pub description: Option<String>,
+ pub r#type: String,
+}
+
+pub trait RepositoryInterface: Countable {
+ const SEARCH_FULLTEXT: i64 = 0;
+ const SEARCH_NAME: i64 = 1;
+ const SEARCH_VENDOR: i64 = 2;
+
+ fn has_package(&self, package: &dyn PackageInterface) -> bool;
+
+ fn find_package(&self, name: String, constraint: FindPackageConstraint) -> Option<Box<BasePackage>>;
+
+ fn find_packages(&self, name: String, constraint: Option<FindPackageConstraint>) -> Vec<Box<BasePackage>>;
+
+ fn get_packages(&self) -> Vec<Box<BasePackage>>;
+
+ fn load_packages(
+ &self,
+ package_name_map: IndexMap<String, Option<Box<dyn ConstraintInterface>>>,
+ acceptable_stabilities: IndexMap<String, i64>,
+ stability_flags: IndexMap<String, i64>,
+ already_loaded: IndexMap<String, IndexMap<String, Box<dyn PackageInterface>>>,
+ ) -> LoadPackagesResult;
+
+ fn search(&self, query: String, mode: i64, r#type: Option<String>) -> Vec<SearchResult>;
+
+ fn get_providers(&self, package_name: String) -> IndexMap<String, ProviderInfo>;
+
+ fn get_repo_name(&self) -> String;
+}