#[ allow( clippy ::std_instead_of_alloc, clippy ::std_instead_of_core ) ]
mod private
{
use crate :: *;
use macros ::kw;
use collection_tools ::collection ::BTreeMap;
use serde_json ::Value;
use std ::
{
borrow ::Cow,
};
#[ derive( Debug, Clone, Copy ) ]
#[ repr( transparent ) ]
pub struct WorkspacePackageRef< 'a >
{
inner: &'a cargo_metadata ::Package,
}
impl< 'a > From< &'a cargo_metadata ::Package > for WorkspacePackageRef< 'a >
{
fn from( inner: &'a cargo_metadata ::Package ) -> Self
{
Self
{
inner
}
}
}
impl< 'a > WorkspacePackageRef< 'a >
{
#[ must_use ]
pub fn name( &'a self ) -> &'a str
{
&self.inner.name
}
pub fn dependencies( &'a self )
-> core ::iter ::Map
<
core ::slice ::Iter< 'a, cargo_metadata ::Dependency >,
fn( &'a cargo_metadata ::Dependency ) -> DependencyRef< 'a >,
>
{
fn dependency_from( dependency: &cargo_metadata ::Dependency ) -> DependencyRef< '_ >
{
dependency.into()
}
self.inner.dependencies.iter().map( dependency_from )
}
pub fn manifest_file( &self ) -> Result< ManifestFile, PathError >
{
self.inner.manifest_path.as_path().try_into()
}
pub fn crate_dir( &self ) -> Result< CrateDir, PathError >
{
self.inner.manifest_path.as_path().parent().unwrap().try_into()
}
#[ must_use ]
pub fn version( &self ) -> semver ::Version
{
self.inner.version.clone()
}
#[ must_use ]
pub fn publish( &self ) -> Option< &Vec< String > >
{
self.inner.publish.as_ref()
}
#[ must_use ]
pub fn metadata( &self ) -> &Value
{
&self.inner.metadata
}
#[ must_use ]
pub fn repository( &self ) -> Option< &String >
{
self.inner.repository.as_ref()
}
#[ must_use ]
pub fn features( &self ) -> &BTreeMap< String, Vec< String > >
{
&self.inner.features
}
}
impl Entries for WorkspacePackageRef< '_ > {
fn entries( &self ) -> impl IterTrait< '_, SourceFile >
{
self.inner.targets.iter().map( | target |
{
let src_path = &target.src_path;
let source: SourceFile = src_path.try_into().unwrap_or_else( | _ | panic!( "Illformed path to source file {src_path}" ) );
source
})
}
}
impl Sources for WorkspacePackageRef< '_ > {
fn sources( &self ) -> impl IterTrait< '_, SourceFile >
{
use walkdir ::WalkDir;
let crate_dir = self.crate_dir().unwrap();
WalkDir ::new( crate_dir )
.into_iter()
.filter_map( Result ::ok )
.filter( | e | e.path().extension().is_some_and(| ext | ext == "rs") ) .map( | e | SourceFile ::try_from( e.path() ).unwrap() )
.collect :: < Vec< _ > >()
.into_iter()
}
}
impl CodeItems for WorkspacePackageRef< '_ > {
fn items( &self ) -> impl IterTrait< '_, syn ::Item >
{
self
.sources()
.flat_map( | source | source.items().collect :: < Vec< _ > >().into_iter() )
.collect :: < Vec< _ > >().into_iter()
}
}
impl AsCode for WorkspacePackageRef< '_ > {
fn as_code( &self ) -> std ::io ::Result< Cow< '_, str > >
{
let mut results: Vec< String > = Vec ::new();
for source in self.sources()
{
let code = source.as_code()?.into_owned();
let mut filename = source
.as_ref()
.with_extension( "" )
.file_name()
.unwrap_or_else( || panic!( "Cant get file name of path {}", source.as_ref().display() ) )
.to_string_lossy()
.replace( '.', "_" );
if kw ::is( &filename )
{
filename.push_str( "_rs" );
}
results.push( format!( "// === Begin of File {}", source.as_ref().display() ) );
results.push( format!( "mod {filename}\n{{\n" ) );
results.push( code );
results.push( "\n}".to_string() );
results.push( format!( "// === End of File {}", source.as_ref().display() ) );
}
let joined = results.join( "\n" );
std ::io ::Result ::Ok( Cow ::Owned( joined ) )
}
}
}
crate ::mod_interface!
{
exposed use WorkspacePackageRef;
}