Pkg name, version
Signed-off-by: Luca Fulchir <luca.fulchir@runesauth.com>
This commit is contained in:
parent
ee85c1d5fa
commit
ebc27deb4f
7
Cargo.lock
generated
7
Cargo.lock
generated
@ -75,6 +75,7 @@ dependencies = [
|
||||
"paste",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"semver",
|
||||
"sha3",
|
||||
]
|
||||
|
||||
@ -249,6 +250,12 @@ dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "semver"
|
||||
version = "1.0.23"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b"
|
||||
|
||||
[[package]]
|
||||
name = "sha3"
|
||||
version = "0.10.8"
|
||||
|
@ -178,6 +178,11 @@ pub fn package(attrs: TokenStream, input: TokenStream) -> TokenStream {
|
||||
.parse2(quote! { base: #base })
|
||||
.unwrap(),
|
||||
);
|
||||
fields.named.push(
|
||||
syn::Field::parse_named
|
||||
.parse2(quote! { version: ::bok::Version })
|
||||
.unwrap(),
|
||||
);
|
||||
}
|
||||
_ => (),
|
||||
}
|
||||
@ -208,6 +213,23 @@ pub fn package(attrs: TokenStream, input: TokenStream) -> TokenStream {
|
||||
pub fn impl_package(_attrs: TokenStream, input: TokenStream) -> TokenStream {
|
||||
let mut ast = parse_macro_input!(input as ::syn::ItemImpl);
|
||||
|
||||
let name_pkg = match &*ast.self_ty {
|
||||
::syn::Type::Path(tp) => match tp.path.get_ident() {
|
||||
Some(id) => id.clone(),
|
||||
_ => panic!("impl_package expected path ident"),
|
||||
},
|
||||
_ => panic!("impl_package expected path"),
|
||||
};
|
||||
let name: ::syn::ImplItem = ::syn::parse_quote! {
|
||||
fn name(&self) -> &'static str {
|
||||
::std::stringify!(#name_pkg)
|
||||
}
|
||||
};
|
||||
let version: ::syn::ImplItem = ::syn::parse_quote! {
|
||||
fn version(&self) -> &::bok::Version {
|
||||
&self.version
|
||||
}
|
||||
};
|
||||
let base: ::syn::ImplItem = ::syn::parse_quote! {
|
||||
fn base(&self) -> ::core::option::Option<&dyn ::bok::Pkg> {
|
||||
Some(&self.base)
|
||||
@ -256,6 +278,8 @@ pub fn impl_package(_attrs: TokenStream, input: TokenStream) -> TokenStream {
|
||||
}
|
||||
}
|
||||
|
||||
ast.items.push(name);
|
||||
ast.items.push(version);
|
||||
ast.items.push(base);
|
||||
ast.items.push(base_mut);
|
||||
ast.items.push(hash);
|
||||
@ -298,7 +322,7 @@ pub fn derive_package(input: TokenStream) -> TokenStream {
|
||||
};
|
||||
let all_fields = elements.iter().filter_map(|field| {
|
||||
if let Some(id) = field.ident.clone() {
|
||||
if id.to_string() != "base" {
|
||||
if id.to_string() != "base" && id.to_string() != "version" {
|
||||
return Some(&field.ident);
|
||||
}
|
||||
}
|
||||
@ -308,7 +332,7 @@ pub fn derive_package(input: TokenStream) -> TokenStream {
|
||||
let all_fields3 = all_fields.clone();
|
||||
let all_fields_mut = elements.iter().filter_map(|field| {
|
||||
if let Some(id) = field.ident.clone() {
|
||||
if id.to_string() != "base" {
|
||||
if id.to_string() != "base" && id.to_string() != "version" {
|
||||
return Some(quote::format_ident!("{}_mut", id.to_string()));
|
||||
}
|
||||
}
|
||||
@ -327,7 +351,7 @@ pub fn derive_package(input: TokenStream) -> TokenStream {
|
||||
.expect("expected a base type");
|
||||
let all_types = elements.iter().filter_map(|field| {
|
||||
if let Some(id) = field.ident.clone() {
|
||||
if id.to_string() != "base" {
|
||||
if id.to_string() != "base" && id.to_string() != "version" {
|
||||
return Some(&field.ty);
|
||||
}
|
||||
}
|
||||
@ -336,7 +360,7 @@ pub fn derive_package(input: TokenStream) -> TokenStream {
|
||||
let all_types2 = all_types.clone();
|
||||
let non_opt_fields = elements.iter().filter_map(|field| {
|
||||
if let Some(id) = field.ident.clone() {
|
||||
if id.to_string() == "base" {
|
||||
if id.to_string() == "base" || id.to_string() == "version" {
|
||||
return None;
|
||||
}
|
||||
}
|
||||
@ -355,7 +379,7 @@ pub fn derive_package(input: TokenStream) -> TokenStream {
|
||||
});
|
||||
let opt_fields = elements.iter().filter_map(|field| {
|
||||
if let Some(id) = field.ident.clone() {
|
||||
if id.to_string() == "base" {
|
||||
if id.to_string() == "base" || id.to_string() == "version" {
|
||||
return None;
|
||||
}
|
||||
}
|
||||
@ -374,7 +398,7 @@ pub fn derive_package(input: TokenStream) -> TokenStream {
|
||||
});
|
||||
let non_opt_types = elements.iter().filter_map(|field| {
|
||||
if let Some(id) = field.ident.clone() {
|
||||
if id.to_string() == "base" {
|
||||
if id.to_string() == "base" || id.to_string() == "version" {
|
||||
return None;
|
||||
}
|
||||
}
|
||||
@ -393,7 +417,7 @@ pub fn derive_package(input: TokenStream) -> TokenStream {
|
||||
});
|
||||
let opt_types = elements.iter().filter_map(|field| {
|
||||
if let Some(id) = field.ident.clone() {
|
||||
if id.to_string() == "base" {
|
||||
if id.to_string() == "base" || id.to_string() == "version" {
|
||||
return None;
|
||||
}
|
||||
}
|
||||
@ -501,7 +525,7 @@ pub fn derive_package(input: TokenStream) -> TokenStream {
|
||||
|
||||
use ::core::fmt::Write;
|
||||
|
||||
let pkg_empty = ::bok::PkgEmpty{};
|
||||
let pkg_empty = ::bok::PkgEmpty::default();
|
||||
let mut pkg_string = String::new();
|
||||
write!(&mut pkg_string,
|
||||
"#[::bok::package({})]\n\
|
||||
@ -578,6 +602,7 @@ pub fn derive_package(input: TokenStream) -> TokenStream {
|
||||
#name {
|
||||
// FIXME: user must be able to override. Trait?
|
||||
base: #base_type::default(),
|
||||
version: #name::default().version,
|
||||
#(#non_opt_fields3 : self.#non_opt_fields3.clone().unwrap(),)*
|
||||
#(#opt_fields2 : self.#opt_fields2.clone(),)*
|
||||
}
|
||||
|
@ -1,9 +1,9 @@
|
||||
/*
|
||||
* Copyright 2024 Luca Fulchir <luca.fulchir@runesauth.com>
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 with LLVM exception (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License and of the exception at
|
||||
* Licensed under the Apache License, Version 2.0 with LLVM exception (the
|
||||
* "License"); you may not use this file except in compliance with the
|
||||
* License. You may obtain a copy of the License and of the exception at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* https://spdx.org/licenses/LLVM-exception.html
|
||||
@ -27,6 +27,13 @@ impl ::std::default::Default for One {
|
||||
One {
|
||||
base: ::bok::PkgEmpty::default(),
|
||||
my_attr: 1,
|
||||
version: ::bok::Version {
|
||||
major: 0,
|
||||
minor: 0,
|
||||
patch: 1,
|
||||
pre: ::bok::Prerelease::EMPTY,
|
||||
build: ::bok::BuildMetadata::EMPTY,
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,9 +1,9 @@
|
||||
/*
|
||||
* Copyright 2024 Luca Fulchir <luca.fulchir@runesauth.com>
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 with LLVM exception (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License and of the exception at
|
||||
* Licensed under the Apache License, Version 2.0 with LLVM exception (the
|
||||
* "License"); you may not use this file except in compliance with the
|
||||
* License. You may obtain a copy of the License and of the exception at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* https://spdx.org/licenses/LLVM-exception.html
|
||||
@ -26,6 +26,13 @@ impl ::std::default::Default for Three {
|
||||
fn default() -> Self {
|
||||
Three {
|
||||
base: bok::PkgEmpty::default(),
|
||||
version: ::bok::Version {
|
||||
major: 0,
|
||||
minor: 0,
|
||||
patch: 3,
|
||||
pre: ::bok::Prerelease::EMPTY,
|
||||
build: ::bok::BuildMetadata::EMPTY,
|
||||
},
|
||||
my_attr: 3,
|
||||
}
|
||||
}
|
||||
|
@ -1,9 +1,9 @@
|
||||
/*
|
||||
* Copyright 2024 Luca Fulchir <luca.fulchir@runesauth.com>
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 with LLVM exception (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License and of the exception at
|
||||
* Licensed under the Apache License, Version 2.0 with LLVM exception (the
|
||||
* "License"); you may not use this file except in compliance with the
|
||||
* License. You may obtain a copy of the License and of the exception at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
* https://spdx.org/licenses/LLVM-exception.html
|
||||
@ -27,6 +27,13 @@ impl ::std::default::Default for Two {
|
||||
Two {
|
||||
base: ::bok::PkgEmpty::default(),
|
||||
my_attr: 2,
|
||||
version: ::bok::Version {
|
||||
major: 0,
|
||||
minor: 0,
|
||||
patch: 2,
|
||||
pre: ::bok::Prerelease::EMPTY,
|
||||
build: ::bok::BuildMetadata::EMPTY,
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -14,9 +14,10 @@ publish = false
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[dependencies]
|
||||
paste = "1.0"
|
||||
bitflags = "2.4"
|
||||
bok-macro = { path="../bok-macro" }
|
||||
paste = "1.0"
|
||||
proc-macro2 = "1.0"
|
||||
quote = "1.0"
|
||||
bok-macro = { path="../bok-macro" }
|
||||
semver = { version = "1.0" }
|
||||
sha3 = { version = "0.10" }
|
||||
|
@ -18,6 +18,7 @@
|
||||
pub use ::bok_macro::{
|
||||
impl_package, package, pkg_fn_to_code, repository, Package, Repository,
|
||||
};
|
||||
pub use ::semver::{BuildMetadata, Prerelease, Version};
|
||||
|
||||
//use ::std::any::Any;
|
||||
|
||||
@ -93,8 +94,10 @@ pub trait PkgCode {
|
||||
}
|
||||
/// Implement common package operations
|
||||
pub trait Pkg:
|
||||
::core::fmt::Debug + ::core::fmt::Display + ::std::any::Any + PkgCode
|
||||
PkgCode + ::core::fmt::Debug + ::core::fmt::Display + ::std::any::Any
|
||||
{
|
||||
fn name(&self) -> &'static str;
|
||||
fn version(&self) -> &Version;
|
||||
fn base(&self) -> ::core::option::Option<&dyn Pkg>;
|
||||
fn base_mut(&mut self) -> ::core::option::Option<&mut dyn Pkg>;
|
||||
fn prepare(&self) -> ::core::result::Result<(), ()> {
|
||||
@ -158,8 +161,24 @@ pub trait PkgBuilder: ::std::any::Any {
|
||||
) -> Result<Self::Package, ::std::boxed::Box<dyn ::std::error::Error>>;
|
||||
}
|
||||
|
||||
#[derive(Default, Debug)]
|
||||
pub struct PkgEmpty {}
|
||||
#[derive(Debug)]
|
||||
pub struct PkgEmpty {
|
||||
version: Version,
|
||||
}
|
||||
|
||||
impl Default for PkgEmpty {
|
||||
fn default() -> Self {
|
||||
PkgEmpty {
|
||||
version: Version {
|
||||
major: 0,
|
||||
minor: 0,
|
||||
patch: 0,
|
||||
pre: Prerelease::EMPTY,
|
||||
build: BuildMetadata::EMPTY,
|
||||
},
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl ::core::fmt::Display for PkgEmpty {
|
||||
fn fmt(&self, _f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {
|
||||
@ -174,6 +193,12 @@ impl PkgCode for PkgEmpty {
|
||||
}
|
||||
|
||||
impl Pkg for PkgEmpty {
|
||||
fn name(&self) -> &'static str {
|
||||
"package_empty"
|
||||
}
|
||||
fn version(&self) -> &Version {
|
||||
&self.version
|
||||
}
|
||||
fn base(&self) -> Option<&dyn Pkg> {
|
||||
None
|
||||
}
|
||||
@ -222,13 +247,13 @@ impl Pkg for PkgEmpty {
|
||||
}
|
||||
fn hash(&self) -> Hash {
|
||||
use ::sha3::Digest;
|
||||
let mut hasher = ::sha3::Sha3_256::new();
|
||||
let hasher = ::sha3::Sha3_256::new();
|
||||
let hash = hasher.finalize();
|
||||
Hash::Sha3(hash)
|
||||
}
|
||||
fn hash_code(&self) -> Hash {
|
||||
use ::sha3::Digest;
|
||||
let mut hasher = ::sha3::Sha3_256::new();
|
||||
let hasher = ::sha3::Sha3_256::new();
|
||||
let hash = hasher.finalize();
|
||||
Hash::Sha3(hash)
|
||||
}
|
||||
@ -280,6 +305,8 @@ impl ::std::fmt::Display for Hash {
|
||||
}
|
||||
}
|
||||
|
||||
pub struct Collection {}
|
||||
|
||||
/*
|
||||
pub enum Value<T: Sized> {
|
||||
/// Set, only once per
|
||||
|
Loading…
Reference in New Issue
Block a user