summaryrefslogtreecommitdiff
path: root/ops/attrs.rs
blob: 95374ef368a73549177f289e613494fa7bd4d807 (plain)
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
// Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.
use syn::{
  parse::{Parse, ParseStream},
  punctuated::Punctuated,
  Error, Ident, Result, Token,
};

#[derive(Copy, Clone, Debug, Default)]
pub struct Attributes {
  pub is_unstable: bool,
  pub is_v8: bool,
  pub must_be_fast: bool,
  pub deferred: bool,
}

impl Parse for Attributes {
  fn parse(input: ParseStream) -> Result<Self> {
    let vars = Punctuated::<Ident, Token![,]>::parse_terminated(input)?;

    let vars: Vec<_> = vars.iter().map(Ident::to_string).collect();
    let vars: Vec<_> = vars.iter().map(String::as_str).collect();
    for var in vars.iter() {
      if !["unstable", "v8", "fast", "deferred"].contains(var) {
        return Err(Error::new(
          input.span(),
          "invalid attribute, expected one of: unstable, v8, fast, deferred",
        ));
      }
    }
    Ok(Self {
      is_unstable: vars.contains(&"unstable"),
      is_v8: vars.contains(&"v8"),
      must_be_fast: vars.contains(&"fast"),
      deferred: vars.contains(&"deferred"),
    })
  }
}