helpers.rs 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. // SPDX-License-Identifier: GPL-2.0
  2. use proc_macro::{token_stream, TokenTree};
  3. pub(crate) fn try_ident(it: &mut token_stream::IntoIter) -> Option<String> {
  4. if let Some(TokenTree::Ident(ident)) = it.next() {
  5. Some(ident.to_string())
  6. } else {
  7. None
  8. }
  9. }
  10. pub(crate) fn try_literal(it: &mut token_stream::IntoIter) -> Option<String> {
  11. if let Some(TokenTree::Literal(literal)) = it.next() {
  12. Some(literal.to_string())
  13. } else {
  14. None
  15. }
  16. }
  17. pub(crate) fn try_byte_string(it: &mut token_stream::IntoIter) -> Option<String> {
  18. try_literal(it).and_then(|byte_string| {
  19. if byte_string.starts_with("b\"") && byte_string.ends_with('\"') {
  20. Some(byte_string[2..byte_string.len() - 1].to_string())
  21. } else {
  22. None
  23. }
  24. })
  25. }
  26. pub(crate) fn expect_ident(it: &mut token_stream::IntoIter) -> String {
  27. try_ident(it).expect("Expected Ident")
  28. }
  29. pub(crate) fn expect_punct(it: &mut token_stream::IntoIter) -> char {
  30. if let TokenTree::Punct(punct) = it.next().expect("Reached end of token stream for Punct") {
  31. punct.as_char()
  32. } else {
  33. panic!("Expected Punct");
  34. }
  35. }
  36. pub(crate) fn expect_byte_string(it: &mut token_stream::IntoIter) -> String {
  37. try_byte_string(it).expect("Expected byte string")
  38. }
  39. pub(crate) fn expect_end(it: &mut token_stream::IntoIter) {
  40. if it.next().is_some() {
  41. panic!("Expected end");
  42. }
  43. }