1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
// Copyright 2018-2022 Parity Technologies (UK) Ltd.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use super::Selector;
use crate::format_err;
use proc_macro2::Span;
use syn::spanned::Spanned as _;
/// Ensures that the given visibility is `pub` and otherwise returns an appropriate error.
///
/// # Note
///
/// The `name` parameter is given to improve the resulting error message. It denotes the
/// entity which cannot have non-public visibility.
pub fn ensure_pub_visibility(
name: &str,
parent_span: Span,
vis: &syn::Visibility,
) -> Result<(), syn::Error> {
let bad_visibility = match vis {
syn::Visibility::Inherited => Some(parent_span),
syn::Visibility::Restricted(vis_restricted) => Some(vis_restricted.span()),
syn::Visibility::Crate(vis_crate) => Some(vis_crate.span()),
syn::Visibility::Public(_) => None,
};
if let Some(bad_visibility) = bad_visibility {
return Err(format_err!(
bad_visibility,
"non `pub` ink! {} are not supported",
name
))
}
Ok(())
}
/// Returns a local ID unique to the ink! trait definition for the identifier.
///
/// # Note
///
/// - The returned value is equal to the selector of the message identifier.
/// - Used from within ink! trait definitions as well as ink! trait implementation blocks.
pub fn local_message_id(ident: &syn::Ident) -> u32 {
let input = ident.to_string().into_bytes();
let selector = Selector::compute(&input);
selector.into_be_u32()
}