11use std:: collections:: { BTreeMap , BTreeSet } ;
22use std:: path:: Path ;
33
4- use super :: dependency:: {
4+ use crate :: dependency:: {
55 DependencyResolutionScope , ResolvedDependencyEdge , ResolvedDependencyGraph ,
66 resolve_dependency_graph,
77} ;
8- use super :: lock:: effective_interface_hash;
9- use super :: review:: review_package_dir_captured_with_features;
10- use super :: source_set:: {
8+ use crate :: lock:: effective_interface_hash;
9+ use crate :: review:: { NativeRustReviewFn , review_package_dir_captured_with_features} ;
10+ use crate :: source_set:: {
1111 ManifestDependencyBudget , ManifestProviderChoice , load_package_manifest,
1212 load_package_with_features,
1313} ;
14- use super :: {
15- PackageDependencyKind , PackageDependencySpec , PackageGraphCheck , PackageRisk , PackageTree ,
16- PackageTreeNode , PackageTreeSummary , package_identity,
14+ use rsscript_package_model:: {
15+ PackageDependencyKind , PackageGraphCheck , PackageIdentity , PackageProviderImplementation ,
16+ PackageReviewFileKind , PackageRisk , PackageTree , PackageTreeNode , PackageTreeSummary ,
17+ PackageVirtual ,
1718} ;
1819
19- pub fn package_tree ( package_dir : & Path ) -> Result < PackageTree , String > {
20- let snapshot = super :: authorization:: snapshot_package_graph_inputs ( package_dir) ?;
21- let mut tree =
22- package_tree_captured ( snapshot. root ( ) ) . map_err ( |error| snapshot. remap_error ( error) ) ?;
23- super :: authorization:: remap_tree ( & snapshot, & mut tree) ;
24- Ok ( tree)
20+ use crate :: { Manifest , PackageDependencySpec , PackageSource } ;
21+
22+ fn package_identity ( manifest : & Manifest ) -> PackageIdentity {
23+ PackageIdentity {
24+ name : manifest. package . name . clone ( ) ,
25+ version : manifest. package . version . clone ( ) ,
26+ edition : manifest. package . edition . clone ( ) ,
27+ }
2528}
2629
27- pub ( super ) fn package_tree_captured ( package_dir : & Path ) -> Result < PackageTree , String > {
30+ /// Build a package tree from captured project inputs. Native Rust wrapper
31+ /// inspection stays outside this boundary and is injected by the legacy
32+ /// compatibility host.
33+ pub fn package_tree_captured (
34+ package_dir : & Path ,
35+ native_rust_review : NativeRustReviewFn ,
36+ ) -> Result < PackageTree , String > {
2837 let graph = resolve_dependency_graph ( package_dir, DependencyResolutionScope :: Development ) ?;
2938 let root = package_tree_node (
3039 & graph,
3140 & graph. root ,
3241 PackageDependencyKind :: Root ,
3342 None ,
3443 & mut BTreeMap :: new ( ) ,
44+ native_rust_review,
3545 ) ?;
3646 let mut summary = PackageTreeSummary :: default ( ) ;
3747 collect_package_tree_summary ( & root, & mut summary, & mut BTreeSet :: new ( ) ) ;
3848 Ok ( PackageTree { root, summary } )
3949}
4050
41- pub ( super ) fn check_package_graph ( package_dir : & Path ) -> Result < PackageGraphCheck , String > {
51+ /// Validate graph-level review facts from captured project inputs.
52+ pub fn check_package_graph (
53+ package_dir : & Path ,
54+ native_rust_review : NativeRustReviewFn ,
55+ ) -> Result < PackageGraphCheck , String > {
4256 let root_manifest = load_package_manifest ( package_dir) ?;
43- let tree = package_tree_captured ( package_dir) ?;
57+ let tree = package_tree_captured ( package_dir, native_rust_review ) ?;
4458 let mut packages_by_name: BTreeMap < String , BTreeSet < String > > = BTreeMap :: new ( ) ;
4559 collect_package_graph_identities ( & tree. root , & mut packages_by_name) ;
4660
@@ -273,7 +287,10 @@ fn canonical_graph_source(source: &str) -> String {
273287 let Some ( path) = source. strip_prefix ( "path+" ) else {
274288 return source. to_string ( ) ;
275289 } ;
276- format ! ( "path+{}" , super :: canonical_path_label( Path :: new( path) ) )
290+ format ! (
291+ "path+{}" ,
292+ rsscript_project:: canonical_project_path_label( Path :: new( path) )
293+ )
277294}
278295
279296fn package_tree_node (
@@ -282,6 +299,7 @@ fn package_tree_node(
282299 dependency_kind : PackageDependencyKind ,
283300 incoming : Option < & ResolvedDependencyEdge > ,
284301 cache : & mut BTreeMap < ( String , PackageDependencyKind ) , PackageTreeNode > ,
302+ native_rust_review : NativeRustReviewFn ,
285303) -> Result < PackageTreeNode , String > {
286304 let cache_key = ( key. to_string ( ) , dependency_kind) ;
287305 if let Some ( cached) = cache. get ( & cache_key) {
@@ -295,7 +313,11 @@ fn package_tree_node(
295313 let package_dir = & resolved. package_dir ;
296314 let features = resolved. features . clone ( ) ;
297315 let package = load_package_with_features ( package_dir, Some ( & features) ) ?;
298- let review = review_package_dir_captured_with_features ( package_dir, Some ( & features) ) ?;
316+ let review = review_package_dir_captured_with_features (
317+ package_dir,
318+ Some ( & features) ,
319+ native_rust_review,
320+ ) ?;
299321 let interface_effective_hash = effective_interface_hash ( & package. sources , & features) ;
300322 let identity = package_identity ( & package. manifest ) ;
301323 let mut dependencies = Vec :: new ( ) ;
@@ -306,7 +328,14 @@ fn package_tree_node(
306328 edge. kind
307329 } ;
308330 dependencies. push ( match & edge. target {
309- Some ( target) => package_tree_node ( graph, target, child_kind, Some ( edge) , cache) ?,
331+ Some ( target) => package_tree_node (
332+ graph,
333+ target,
334+ child_kind,
335+ Some ( edge) ,
336+ cache,
337+ native_rust_review,
338+ ) ?,
310339 None => {
311340 unresolved_dependency_node ( edge. spec . clone ( ) , child_kind, unresolved_reasons ( edge) )
312341 }
@@ -319,7 +348,7 @@ fn package_tree_node(
319348 name : identity. name ,
320349 version : Some ( identity. version ) ,
321350 requirement : spec. and_then ( |spec| spec. requirement . clone ( ) ) ,
322- source : super :: package_path_source ( package_dir) ,
351+ source : rsscript_project :: project_path_source ( package_dir) ,
323352 risk : review. risk ,
324353 features,
325354 native : review. native_rust . is_some ( ) ,
@@ -391,14 +420,12 @@ fn unresolved_dependency_node(
391420 }
392421}
393422
394- fn package_provider_implementations (
395- manifest : & super :: Manifest ,
396- ) -> Vec < super :: PackageProviderImplementation > {
423+ fn package_provider_implementations ( manifest : & Manifest ) -> Vec < PackageProviderImplementation > {
397424 manifest
398425 . implements
399426 . iter ( )
400427 . map (
401- |( interface_package, implementation) | super :: PackageProviderImplementation {
428+ |( interface_package, implementation) | PackageProviderImplementation {
402429 interface_package : interface_package. clone ( ) ,
403430 version : implementation. version . clone ( ) ,
404431 interface_features : implementation. interface_features . clone ( ) ,
@@ -408,23 +435,23 @@ fn package_provider_implementations(
408435 . collect ( )
409436}
410437
411- fn package_virtual ( manifest : & super :: Manifest ) -> Option < super :: PackageVirtual > {
438+ fn package_virtual ( manifest : & Manifest ) -> Option < PackageVirtual > {
412439 manifest
413440 . virtual_package
414441 . as_ref ( )
415- . map ( |virtual_package| super :: PackageVirtual {
442+ . map ( |virtual_package| PackageVirtual {
416443 has_default : virtual_package. has_default ,
417444 provider : virtual_package. provider . clone ( ) ,
418445 } )
419446}
420447
421- fn package_is_interface_only ( sources : & [ super :: PackageSource ] ) -> bool {
448+ fn package_is_interface_only ( sources : & [ PackageSource ] ) -> bool {
422449 let has_interface = sources
423450 . iter ( )
424- . any ( |source| source. kind == super :: PackageReviewFileKind :: Interface ) ;
451+ . any ( |source| source. kind == PackageReviewFileKind :: Interface ) ;
425452 let has_source = sources
426453 . iter ( )
427- . any ( |source| source. kind == super :: PackageReviewFileKind :: Source ) ;
454+ . any ( |source| source. kind == PackageReviewFileKind :: Source ) ;
428455 has_interface && !has_source
429456}
430457
0 commit comments