codegen.rs 45 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150
  1. use crate::*;
  2. use proc_macro2::TokenStream;
  3. use quote::{quote, ToTokens};
  4. macro_rules! path {
  5. ($($t:tt)+) => {
  6. ::quote::quote!(::style:: $($t)+)
  7. };
  8. }
  9. impl ToTokens for DynamicStyles {
  10. fn to_tokens(&self, tokens: &mut TokenStream) {
  11. let parts = self
  12. .rules
  13. .iter()
  14. .filter(|style| !style.is_dummy())
  15. .map(|style| style.to_token_stream());
  16. tokens.extend(quote! {
  17. {
  18. let mut styles = style::Styles::new();
  19. #(styles.push(#parts);)*
  20. styles
  21. }
  22. })
  23. }
  24. }
  25. impl ToTokens for DynamicStyle {
  26. fn to_tokens(&self, tokens: &mut TokenStream) {
  27. tokens.extend(match self {
  28. DynamicStyle::Dynamic(block) => quote!(#block),
  29. DynamicStyle::Literal(lit) => quote!(#lit),
  30. })
  31. }
  32. }
  33. impl ToTokens for Style {
  34. fn to_tokens(&self, tokens: &mut TokenStream) {
  35. let path = quote!(::style::Style::);
  36. tokens.extend(match self {
  37. Style::Dummy => quote!(#path Dummy),
  38. Style::Unchecked(v) => quote!(#path Unchecked(String::from(#v))),
  39. Style::AlignContent(v) => quote!(#path AlignContent(#v)),
  40. Style::AlignItems(v) => quote!(#path AlignItems(#v)),
  41. Style::AlignSelf(v) => quote!(#path AlignSelf(#v)),
  42. // all
  43. // background
  44. Style::BackgroundAttachment(v) => quote!(#path BackgroundAttachment(#v)),
  45. Style::BackgroundBlendMode(v) => quote!(#path BackgroundBlendMode(#v)),
  46. Style::BackgroundClip(v) => quote!(#path BackgroundClip(#v)),
  47. Style::BackgroundColor(v) => quote!(#path BackgroundColor(#v)),
  48. Style::BackgroundImage(v) => quote!(#path BackgroundImage(#v)),
  49. Style::BackgroundOrigin(v) => quote!(#path BackgroundOrigin(#v)),
  50. Style::BackgroundPosition(v) => quote!(#path BackgroundPosition(#v)),
  51. Style::BackgroundRepeat(v) => quote!(#path BackgroundRepeat(#v)),
  52. Style::BackgroundSize(v) => quote!(#path BackgroundSize(#v)),
  53. Style::Border(v) => quote!(#path Border(#v)),
  54. Style::BorderBottom(v) => quote!(#path BorderBottom(#v)),
  55. Style::BorderBottomColor(v) => quote!(#path BorderBottomColor(#v)),
  56. Style::BorderBottomLeftRadius(v) => quote!(#path BorderBottomLeftRadius(#v)),
  57. Style::BorderBottomRightRadius(v) => quote!(#path BorderBottomRightRadius(#v)),
  58. Style::BorderBottomStyle(v) => quote!(#path BorderBottomStyle(#v)),
  59. Style::BorderBottomWidth(v) => quote!(#path BorderBottomWidth(#v)),
  60. Style::BorderCollapse(v) => quote!(#path BorderCollapse(#v)),
  61. Style::BorderColor(v) => quote!(#path BorderColor(#v)),
  62. // border-image
  63. // border-image-outset
  64. // border-image-repeat
  65. // border-image-slice
  66. // border-image-source
  67. // border-image-width
  68. Style::BorderLeft(v) => quote!(#path BorderLeft(#v)),
  69. Style::BorderLeftColor(v) => quote!(#path BorderLeftColor(#v)),
  70. Style::BorderLeftStyle(v) => quote!(#path BorderLeftStyle(#v)),
  71. Style::BorderLeftWidth(v) => quote!(#path BorderLeftWidth(#v)),
  72. Style::BorderRadius(v) => quote!(#path BorderRadius(#v)),
  73. Style::BorderRight(v) => quote!(#path BorderRight(#v)),
  74. Style::BorderRightColor(v) => quote!(#path BorderRightColor(#v)),
  75. Style::BorderRightStyle(v) => quote!(#path BorderRightStyle(#v)),
  76. Style::BorderRightWidth(v) => quote!(#path BorderRightWidth(#v)),
  77. // border-spacing
  78. Style::BorderStyle(v) => quote!(#path BorderStyle(#v)),
  79. Style::BorderTop(v) => quote!(#path BorderTop(#v)),
  80. Style::BorderTopColor(v) => quote!(#path BorderTopColor(#v)),
  81. Style::BorderTopLeftRadius(v) => quote!(#path BorderTopLeftRadius(#v)),
  82. Style::BorderTopRightRadius(v) => quote!(#path BorderTopRightRadius(#v)),
  83. Style::BorderTopStyle(v) => quote!(#path BorderTopStyle(#v)),
  84. Style::BorderTopWidth(v) => quote!(#path BorderTopWidth(#v)),
  85. Style::BorderWidth(v) => quote!(#path BorderWidth(#v)),
  86. Style::Bottom(v) => quote!(#path Bottom(#v)),
  87. // box-decoration-break
  88. Style::BoxShadow(v) => quote!(#path BoxShadow(#v)),
  89. Style::BoxSizing(v) => quote!(#path BoxSizing(#v)),
  90. // break-after
  91. // break-before
  92. // break-inside
  93. // caption-side
  94. // caret-color
  95. Style::Clear(v) => quote!(#path Clear(#v)),
  96. // clip
  97. // clip-path
  98. // clip-rule
  99. Style::ColumnCount(v) => quote!(#path ColumnCount(#v)),
  100. Style::Color(v) => quote!(#path Color(#v)),
  101. // contain
  102. // content
  103. // counter-increment
  104. // counter-reset
  105. // cue
  106. // cue-after
  107. // cue-before
  108. Style::Cursor(v) => quote!(#path Cursor(#v)),
  109. // direction
  110. Style::Display(v) => quote!(#path Display(#v)),
  111. // elevation
  112. // empty-cells
  113. // flex
  114. Style::FlexBasis(v) => quote!(#path FlexBasis(#v)),
  115. Style::FlexDirection(v) => quote!(#path FlexDirection(#v)),
  116. // flex-flow
  117. Style::FlexGrow(v) => quote!(#path FlexGrow(#v)),
  118. Style::FlexShrink(v) => quote!(#path FlexShrink(#v)),
  119. Style::FlexWrap(v) => quote!(#path FlexWrap(#v)),
  120. Style::Float(v) => quote!(#path Float(#v)),
  121. // font
  122. Style::FontFamily(v) => quote!(#path FontFamily(#v)),
  123. // font-feature-settings
  124. // font-kerning
  125. Style::FontSize(v) => quote!(#path FontSize(#v)),
  126. // font-size-adjust
  127. // font-stretch
  128. Style::FontStyle(v) => quote!(#path FontStyle(#v)),
  129. // font-synthesis
  130. // font-variant
  131. // font-variant-caps
  132. // font-variant-east-asian
  133. // font-variant-ligatures
  134. // font-variant-numeric
  135. // font-variant-position
  136. Style::FontWeight(v) => quote!(#path FontWeight(#v)),
  137. // glyph-orientation-vertical
  138. // grid
  139. // grid-area
  140. // grid-auto-columns
  141. // grid-auto-flow
  142. // grid-auto-rows
  143. // grid-column
  144. // grid-column-end
  145. // grid-column-start
  146. // grid-row
  147. // grid-row-end
  148. // grid-row-start
  149. // grid-template
  150. // grid-template-areas
  151. // grid-template-columns
  152. // grid-template-rows
  153. Style::Height(v) => quote!(#path Height(#v)),
  154. // image-orientation
  155. // image-rendering
  156. // isolation
  157. Style::JustifyContent(v) => quote!(#path JustifyContent(#v)),
  158. Style::Left(v) => quote!(#path Left(#v)),
  159. // letter-spacing
  160. Style::LineHeight(v) => quote!(#path LineHeight(#v)),
  161. // list-style
  162. // list-style-image
  163. // list-style-position
  164. Style::ListStyleType(v) => quote!(#path ListStyleType(#v)),
  165. Style::Margin(v) => quote!(#path Margin(#v)),
  166. Style::MarginBottom(v) => quote!(#path MarginBottom(#v)),
  167. Style::MarginLeft(v) => quote!(#path MarginLeft(#v)),
  168. Style::MarginRight(v) => quote!(#path MarginRight(#v)),
  169. Style::MarginTop(v) => quote!(#path MarginTop(#v)),
  170. // mask
  171. // mask-border
  172. // mask-border-mode
  173. // mask-border-outset
  174. // mask-border-repeat
  175. // mask-border-slice
  176. // mask-border-source
  177. // mask-border-width
  178. // mask-clip
  179. // mask-composite
  180. // mask-image
  181. // mask-mode
  182. // mask-origin
  183. // mask-position
  184. // mask-repeat
  185. // mask-size
  186. // mask-type
  187. Style::MaxHeight(v) => quote!(#path MaxHeight(#v)),
  188. Style::MaxWidth(v) => quote!(#path MaxWidth(#v)),
  189. Style::MinHeight(v) => quote!(#path MinHeight(#v)),
  190. Style::MinWidth(v) => quote!(#path MinWidth(#v)),
  191. // mix-blend-mode
  192. Style::ObjectFit(v) => quote!(#path ObjectFit(#v)),
  193. // object-position
  194. // opacity
  195. // order
  196. // orphans
  197. // outline
  198. // outline-color
  199. // outline-offset
  200. // outline-style
  201. // outline-width
  202. Style::Overflow(v) => quote!(#path Overflow(#v)),
  203. Style::OverflowX(v) => quote!(#path OverflowX(#v)),
  204. Style::OverflowY(v) => quote!(#path OverflowY(#v)),
  205. Style::Padding(v) => quote!(#path Padding(#v)),
  206. Style::PaddingBottom(v) => quote!(#path PaddingBottom(#v)),
  207. Style::PaddingLeft(v) => quote!(#path PaddingLeft(#v)),
  208. Style::PaddingRight(v) => quote!(#path PaddingRight(#v)),
  209. Style::PaddingTop(v) => quote!(#path PaddingTop(#v)),
  210. // page-break-after
  211. // page-break-before
  212. // page-break-inside
  213. // pause
  214. // pause-after
  215. // pause-before
  216. // pitch
  217. // pitch-range
  218. // play-during
  219. Style::Position(v) => quote!(#path Position(#v)),
  220. // quotes
  221. Style::Resize(v) => quote!(#path Resize(#v)),
  222. // richness
  223. Style::Right(v) => quote!(#path Right(#v)),
  224. // scroll-margin
  225. // scroll-margin-block
  226. // scroll-margin-block-end
  227. // scroll-margin-block-start
  228. // scroll-margin-bottom
  229. // scroll-margin-inline
  230. // scroll-margin-inline-end
  231. // scroll-margin-inline-start
  232. // scroll-margin-left
  233. // scroll-margin-right
  234. // scroll-margin-top
  235. // scroll-padding
  236. // scroll-padding-block
  237. // scroll-padding-block-end
  238. // scroll-padding-block-start
  239. // scroll-padding-bottom
  240. // scroll-padding-inline
  241. // scroll-padding-inline-end
  242. // scroll-padding-inline-start
  243. // scroll-padding-left
  244. // scroll-padding-right
  245. // scroll-padding-top
  246. // scroll-snap-align
  247. // scroll-snap-stop
  248. // scroll-snap-type
  249. // shape-image-threshold
  250. // shape-margin
  251. // shape-outside
  252. // speak
  253. // speak-header
  254. // speak-numeral
  255. // speak-punctuation
  256. // speech-rate
  257. // stress
  258. // table-layout
  259. Style::TextAlign(v) => quote!(#path TextAlign(#v)),
  260. // text-combine-upright
  261. // text-decoration
  262. // text-decoration-color
  263. // text-decoration-line
  264. // text-decoration-style
  265. // text-emphasis
  266. // text-emphasis-color
  267. // text-emphasis-position
  268. // text-emphasis-style
  269. // text-indent
  270. // text-orientation
  271. // text-overflow
  272. // text-shadow
  273. // text-transform
  274. // text-underline-position
  275. Style::Top(v) => quote!(#path Top(#v)),
  276. // transform
  277. // transform-box
  278. // transform-origin
  279. // unicode-bidi
  280. // vertical-align
  281. // visibility
  282. // voice-family
  283. // volume
  284. // white-space
  285. Style::WhiteSpace(v) => quote!(#path WhiteSpace(#v)),
  286. Style::Widows(v) => quote!(#path Widows(#v)),
  287. Style::Width(v) => quote!(#path Width(#v)),
  288. // will-change
  289. // word-spacing
  290. // writing-mode
  291. // z-index
  292. });
  293. }
  294. }
  295. impl ToTokens for AlignContent {
  296. fn to_tokens(&self, tokens: &mut TokenStream) {
  297. tokens.extend(match self {
  298. AlignContent::FlexStart => path!(AlignContent::FlexStart),
  299. AlignContent::Center => path!(AlignContent::Center),
  300. AlignContent::FlexEnd => path!(style::AlignContent::FlexEnd),
  301. AlignContent::SpaceAround => path!(AlignContent::SpaceAround),
  302. AlignContent::SpaceBetween => path!(AlignContent::SpaceBetween),
  303. AlignContent::Stretch => path!(AlignContent::Stretch),
  304. });
  305. }
  306. }
  307. impl ToTokens for Cursor {
  308. fn to_tokens(&self, tokens: &mut TokenStream) {
  309. tokens.extend(match self {
  310. Cursor::Auto => path!(Cursor::Auto),
  311. Cursor::Default => path!(Cursor::Default),
  312. Cursor::None => path!(Cursor::None),
  313. Cursor::ContextMenu => path!(Cursor::ContextMenu),
  314. Cursor::Help => path!(Cursor::Help),
  315. Cursor::Pointer => path!(Cursor::Pointer),
  316. Cursor::Progress => path!(Cursor::Progress),
  317. Cursor::Wait => path!(Cursor::Wait),
  318. Cursor::Cell => path!(Cursor::Cell),
  319. Cursor::Crosshair => path!(Cursor::Crosshair),
  320. Cursor::Text => path!(Cursor::Text),
  321. Cursor::VerticalText => path!(Cursor::VerticalText),
  322. Cursor::Alias => path!(Cursor::Alias),
  323. Cursor::Copy => path!(Cursor::Copy),
  324. Cursor::Move => path!(Cursor::Move),
  325. Cursor::NoDrop => path!(Cursor::NoDrop),
  326. Cursor::NotAllowed => path!(Cursor::NotAllowed),
  327. Cursor::Grab => path!(Cursor::Grab),
  328. Cursor::Grabbing => path!(Cursor::Grabbing),
  329. Cursor::EResize => path!(Cursor::EResize),
  330. Cursor::NResize => path!(Cursor::NResize),
  331. Cursor::NEResize => path!(Cursor::NEResize),
  332. Cursor::NWResize => path!(Cursor::NWResize),
  333. Cursor::SResize => path!(Cursor::SResize),
  334. Cursor::SEResize => path!(Cursor::SEResize),
  335. Cursor::SWResize => path!(Cursor::SWResize),
  336. Cursor::WResize => path!(Cursor::WResize),
  337. Cursor::EWResize => path!(Cursor::EWResize),
  338. Cursor::NSResize => path!(Cursor::NSResize),
  339. Cursor::NESWResize => path!(Cursor::NESWResize),
  340. Cursor::NWSEResize => path!(Cursor::NWSEResize),
  341. Cursor::ColResize => path!(Cursor::ColResize),
  342. Cursor::RowResize => path!(Cursor::RowResize),
  343. Cursor::AllScroll => path!(Cursor::AllScroll),
  344. Cursor::ZoomIn => path!(Cursor::ZoomIn),
  345. Cursor::ZoomOut => path!(Cursor::ZoomOut),
  346. })
  347. }
  348. }
  349. impl ToTokens for Display {
  350. fn to_tokens(&self, tokens: &mut TokenStream) {
  351. tokens.extend(match self {
  352. Display::Block => path!(Display::Block),
  353. Display::Flex => path!(Display::Flex),
  354. Display::Inline => path!(Display::Inline),
  355. });
  356. }
  357. }
  358. impl ToTokens for FlexBasis {
  359. fn to_tokens(&self, tokens: &mut TokenStream) {
  360. tokens.extend(match self {
  361. FlexBasis::Width(v) => path!(FlexBasis::Width(#v)),
  362. FlexBasis::Content => path!(FlexBasis::Content),
  363. });
  364. }
  365. }
  366. impl ToTokens for FlexDirection {
  367. fn to_tokens(&self, tokens: &mut TokenStream) {
  368. tokens.extend(match self {
  369. FlexDirection::Row => path!(FlexDirection::Row),
  370. FlexDirection::Column => path!(FlexDirection::Column),
  371. });
  372. }
  373. }
  374. impl ToTokens for FlexWrap {
  375. fn to_tokens(&self, tokens: &mut TokenStream) {
  376. tokens.extend(match self {
  377. FlexWrap::Wrap => path!(FlexWrap::Wrap),
  378. FlexWrap::Nowrap => path!(FlexWrap::Nowrap),
  379. });
  380. }
  381. }
  382. impl ToTokens for AlignItems {
  383. fn to_tokens(&self, tokens: &mut TokenStream) {
  384. tokens.extend(match self {
  385. AlignItems::Normal => path!(AlignItems::Normal),
  386. AlignItems::Stretch => path!(AlignItems::Stretch),
  387. AlignItems::Center => path!(AlignItems::Center),
  388. AlignItems::Start => path!(AlignItems::Start),
  389. AlignItems::End => path!(AlignItems::End),
  390. AlignItems::FlexStart => path!(AlignItems::FlexStart),
  391. AlignItems::FlexEnd => path!(AlignItems::FlexEnd),
  392. AlignItems::Baseline => path!(AlignItems::Baseline),
  393. AlignItems::FirstBaseline => path!(AlignItems::FirstBaseline),
  394. AlignItems::LastBaseline => path!(AlignItems::LastBaseline),
  395. AlignItems::SafeCenter => path!(AlignItems::SafeCenter),
  396. AlignItems::UnsafeCenter => path!(AlignItems::UnsafeCenter),
  397. });
  398. }
  399. }
  400. impl ToTokens for AlignSelf {
  401. fn to_tokens(&self, tokens: &mut TokenStream) {
  402. tokens.extend(match self {
  403. AlignSelf::Auto => path!(AlignSelf::Auto),
  404. AlignSelf::Normal => path!(AlignSelf::Normal),
  405. AlignSelf::Center => path!(AlignSelf::Center),
  406. AlignSelf::Start => path!(AlignSelf::Start),
  407. AlignSelf::End => path!(AlignSelf::End),
  408. AlignSelf::SelfStart => path!(AlignSelf::SelfStart),
  409. AlignSelf::SelfEnd => path!(AlignSelf::SelfEnd),
  410. AlignSelf::FlexStart => path!(AlignSelf::FlexStart),
  411. AlignSelf::FlexEnd => path!(AlignSelf::FlexEnd),
  412. AlignSelf::Baseline => path!(AlignSelf::Baseline),
  413. AlignSelf::FirstBaseline => path!(AlignSelf::FirstBaseline),
  414. AlignSelf::LastBaseline => path!(AlignSelf::LastBaseline),
  415. AlignSelf::Stretch => path!(AlignSelf::Stretch),
  416. AlignSelf::SafeCenter => path!(AlignSelf::SafeCenter),
  417. AlignSelf::UnsafeCenter => path!(AlignSelf::UnsafeCenter),
  418. });
  419. }
  420. }
  421. impl ToTokens for BackgroundAttachment {
  422. fn to_tokens(&self, tokens: &mut TokenStream) {
  423. tokens.extend(match self {
  424. BackgroundAttachment::Scroll => path!(BackgroundAttachment::Scroll),
  425. BackgroundAttachment::Fixed => path!(BackgroundAttachment::Fixed),
  426. BackgroundAttachment::Local => path!(BackgroundAttachment::Local),
  427. })
  428. }
  429. }
  430. impl ToTokens for BlendMode {
  431. fn to_tokens(&self, tokens: &mut TokenStream) {
  432. tokens.extend(match self {
  433. BlendMode::Normal => path!(BlendMode::Normal),
  434. BlendMode::Multiply => path!(BlendMode::Multiply),
  435. BlendMode::Screen => path!(BlendMode::Screen),
  436. BlendMode::Overlay => path!(BlendMode::Overlay),
  437. BlendMode::Darken => path!(BlendMode::Darken),
  438. BlendMode::Lighten => path!(BlendMode::Lighten),
  439. BlendMode::ColorDodge => path!(BlendMode::ColorDodge),
  440. BlendMode::ColorBurn => path!(BlendMode::ColorBurn),
  441. BlendMode::HardLight => path!(BlendMode::HardLight),
  442. BlendMode::SoftLight => path!(BlendMode::SoftLight),
  443. BlendMode::Difference => path!(BlendMode::Difference),
  444. BlendMode::Exclusion => path!(BlendMode::Exclusion),
  445. BlendMode::Hue => path!(BlendMode::Hue),
  446. BlendMode::Saturation => path!(BlendMode::Saturation),
  447. BlendMode::Color => path!(BlendMode::Color),
  448. BlendMode::Luminosity => path!(BlendMode::Luminosity),
  449. })
  450. }
  451. }
  452. impl ToTokens for BackgroundBox {
  453. fn to_tokens(&self, tokens: &mut TokenStream) {
  454. tokens.extend(match self {
  455. BackgroundBox::BorderBox => path!(BackgroundBox::BorderBox),
  456. BackgroundBox::PaddingBox => path!(BackgroundBox::PaddingBox),
  457. BackgroundBox::ContentBox => path!(BackgroundBox::ContentBox),
  458. })
  459. }
  460. }
  461. impl ToTokens for BackgroundImage {
  462. fn to_tokens(&self, tokens: &mut TokenStream) {
  463. tokens.extend(match self {
  464. BackgroundImage::None => path!(BackgroundImage::None),
  465. BackgroundImage::Url(url) => path!(BackgroundImage::Url(#url)),
  466. })
  467. }
  468. }
  469. impl ToTokens for BackgroundPosition {
  470. fn to_tokens(&self, tokens: &mut TokenStream) {
  471. tokens.extend(match self {
  472. BackgroundPosition::Top => path!(BackgroundPosition::Top),
  473. BackgroundPosition::Bottom => path!(BackgroundPosition::Bottom),
  474. BackgroundPosition::Left => path!(BackgroundPosition::Left),
  475. BackgroundPosition::Right => path!(BackgroundPosition::Right),
  476. BackgroundPosition::Center => path!(BackgroundPosition::Center),
  477. })
  478. }
  479. }
  480. impl ToTokens for BackgroundRepeat {
  481. fn to_tokens(&self, tokens: &mut TokenStream) {
  482. tokens.extend(match self {
  483. BackgroundRepeat::RepeatX => path!(BackgroundRepeat::RepeatX),
  484. BackgroundRepeat::RepeatY => path!(BackgroundRepeat::RepeatY),
  485. BackgroundRepeat::SingleOrDouble(v) => path!(BackgroundRepeat::SingleOrDouble(#v)),
  486. })
  487. }
  488. }
  489. impl ToTokens for BgRepeatPart {
  490. fn to_tokens(&self, tokens: &mut TokenStream) {
  491. tokens.extend(match self {
  492. BgRepeatPart::Repeat => path!(BgRepeatPart::Repeat),
  493. BgRepeatPart::Space => path!(BgRepeatPart::Space),
  494. BgRepeatPart::Round => path!(BgRepeatPart::Round),
  495. BgRepeatPart::NoRepeat => path!(BgRepeatPart::NoRepeat),
  496. })
  497. }
  498. }
  499. impl ToTokens for BackgroundSize {
  500. fn to_tokens(&self, tokens: &mut TokenStream) {
  501. tokens.extend(match self {
  502. BackgroundSize::Cover => path!(BackgroundSize::Cover),
  503. BackgroundSize::Contain => path!(BackgroundSize::Contain),
  504. BackgroundSize::SingleOrDouble(v) => path!(BackgroundSize::SingleOrDouble(#v)),
  505. })
  506. }
  507. }
  508. impl ToTokens for BorderCollapse {
  509. fn to_tokens(&self, tokens: &mut TokenStream) {
  510. tokens.extend(match self {
  511. BorderCollapse::Collapse => path!(BorderCollapse::Collapse),
  512. BorderCollapse::Separate => path!(BorderCollapse::Separate),
  513. })
  514. }
  515. }
  516. impl ToTokens for JustifyContent {
  517. fn to_tokens(&self, tokens: &mut TokenStream) {
  518. tokens.extend(match self {
  519. JustifyContent::FlexStart => path!(JustifyContent::FlexStart),
  520. JustifyContent::Center => path!(JustifyContent::Center),
  521. JustifyContent::FlexEnd => path!(JustifyContent::FlexEnd),
  522. JustifyContent::SpaceAround => path!(JustifyContent::SpaceAround),
  523. JustifyContent::SpaceBetween => path!(JustifyContent::SpaceBetween),
  524. });
  525. }
  526. }
  527. impl ToTokens for Float {
  528. fn to_tokens(&self, tokens: &mut TokenStream) {
  529. tokens.extend(match self {
  530. Float::None => path!(Float::None),
  531. Float::Left => path!(Float::Left),
  532. Float::Right => path!(Float::Right),
  533. Float::InlineStart => path!(Float::InlineStart),
  534. Float::InlineEnd => path!(Float::InlineEnd),
  535. })
  536. }
  537. }
  538. impl ToTokens for FontWeight {
  539. fn to_tokens(&self, tokens: &mut TokenStream) {
  540. tokens.extend(match self {
  541. FontWeight::Normal => path!(FontWeight::Normal),
  542. FontWeight::Bold => path!(FontWeight::Bold),
  543. FontWeight::Lighter => path!(FontWeight::Lighter),
  544. FontWeight::Bolder => path!(FontWeight::Bolder),
  545. FontWeight::Number(v) => path!(FontWeight::Number(#v)),
  546. });
  547. }
  548. }
  549. impl ToTokens for Font {
  550. fn to_tokens(&self, tokens: &mut TokenStream) {
  551. tokens.extend(match self {
  552. Font::Named(inner) => path!(Font::Named(String::from(#inner))),
  553. Font::Serif => path!(Font::Serif),
  554. Font::SansSerif => path!(Font::SansSerif),
  555. Font::Cursive => path!(Font::Cursive),
  556. Font::Fantasy => path!(Font::Fantasy),
  557. Font::Monospace => path!(Font::Monospace),
  558. })
  559. }
  560. }
  561. impl ToTokens for FontSize {
  562. fn to_tokens(&self, tokens: &mut TokenStream) {
  563. tokens.extend(match self {
  564. FontSize::XXSmall => path!(FontSize::XXSmall),
  565. FontSize::XSmall => path!(FontSize::XSmall),
  566. FontSize::Small => path!(FontSize::Small),
  567. FontSize::Medium => path!(FontSize::Medium),
  568. FontSize::Large => path!(FontSize::Large),
  569. FontSize::XLarge => path!(FontSize::XLarge),
  570. FontSize::XXLarge => path!(FontSize::XXLarge),
  571. FontSize::XXXLarge => path!(FontSize::XXXLarge),
  572. FontSize::Larger => path!(FontSize::Larger),
  573. FontSize::Smaller => path!(FontSize::Smaller),
  574. FontSize::LengthPercentage(v) => path!(FontSize::LengthPercentage(#v)),
  575. });
  576. }
  577. }
  578. impl ToTokens for FontStyle {
  579. fn to_tokens(&self, tokens: &mut TokenStream) {
  580. tokens.extend(match self {
  581. FontStyle::Normal => path!(FontStyle::Normal),
  582. FontStyle::Italic => path!(FontStyle::Italic),
  583. FontStyle::Oblique => path!(FontStyle::Oblique),
  584. });
  585. }
  586. }
  587. impl ToTokens for Border {
  588. fn to_tokens(&self, tokens: &mut TokenStream) {
  589. let line_width = match self.line_width {
  590. Some(line_width) => quote!(Some(#line_width)),
  591. None => quote!(None),
  592. };
  593. let line_style = match self.line_style {
  594. Some(line_style) => quote!(Some(#line_style)),
  595. None => quote!(None),
  596. };
  597. let color = match self.color {
  598. Some(color) => quote!(Some(#color)),
  599. None => quote!(None),
  600. };
  601. tokens.extend(quote!(
  602. style::Border {
  603. line_width: #line_width,
  604. line_style: #line_style,
  605. color: #color,
  606. }
  607. ))
  608. }
  609. }
  610. impl ToTokens for BoxShadow {
  611. fn to_tokens(&self, tokens: &mut TokenStream) {
  612. tokens.extend(match self {
  613. BoxShadow::None => path!(BoxShadow::None),
  614. BoxShadow::Shadows(list) => path!(BoxShadow::Shadows(#list)),
  615. });
  616. }
  617. }
  618. impl ToTokens for BoxSizing {
  619. fn to_tokens(&self, tokens: &mut TokenStream) {
  620. tokens.extend(match self {
  621. BoxSizing::BorderBox => path!(BoxSizing::BorderBox),
  622. BoxSizing::ContentBox => path!(BoxSizing::ContentBox),
  623. });
  624. }
  625. }
  626. impl ToTokens for Clear {
  627. fn to_tokens(&self, tokens: &mut TokenStream) {
  628. tokens.extend(match self {
  629. Clear::None => path!(Clear::None),
  630. Clear::Left => path!(Clear::Left),
  631. Clear::Right => path!(Clear::Right),
  632. Clear::Both => path!(Clear::Both),
  633. Clear::InlineStart => path!(Clear::InlineStart),
  634. Clear::InlineEnd => path!(Clear::InlineEnd),
  635. })
  636. }
  637. }
  638. impl ToTokens for ColumnCount {
  639. fn to_tokens(&self, tokens: &mut TokenStream) {
  640. tokens.extend(match self {
  641. ColumnCount::Auto => path!(ColumnCount::Auto),
  642. ColumnCount::Fixed(v) => path!(ColumnCount::Fixed(#v)),
  643. })
  644. }
  645. }
  646. impl ToTokens for Overflow {
  647. fn to_tokens(&self, tokens: &mut TokenStream) {
  648. tokens.extend(match self {
  649. Overflow::Both(v) => path!(Overflow::Both(#v)),
  650. Overflow::XY(x, y) => path!(Overflow::XY(#x, #y)),
  651. })
  652. }
  653. }
  654. impl ToTokens for OverflowXY {
  655. fn to_tokens(&self, tokens: &mut TokenStream) {
  656. tokens.extend(match self {
  657. OverflowXY::Visible => path!(OverflowXY::Visible),
  658. OverflowXY::Hidden => path!(OverflowXY::Hidden),
  659. OverflowXY::Clip => path!(OverflowXY::Clip),
  660. OverflowXY::Scroll => path!(OverflowXY::Scroll),
  661. OverflowXY::Auto => path!(OverflowXY::Auto),
  662. })
  663. }
  664. }
  665. impl ToTokens for ObjectFit {
  666. fn to_tokens(&self, tokens: &mut TokenStream) {
  667. tokens.extend(match self {
  668. ObjectFit::Fill => path!(ObjectFit::Fill),
  669. ObjectFit::None => path!(ObjectFit::None),
  670. ObjectFit::Contain { scale_down } => {
  671. path!(ObjectFit::Contain { scale_down: #scale_down })
  672. }
  673. ObjectFit::Cover { scale_down } => path!(ObjectFit::Cover { scale_down: #scale_down }),
  674. })
  675. }
  676. }
  677. impl<T> ToTokens for Rect<T>
  678. where
  679. T: ToTokens,
  680. {
  681. fn to_tokens(&self, tokens: &mut TokenStream) {
  682. tokens.extend(match self {
  683. Rect::All(v) => path!(Rect::All(#v)),
  684. Rect::VerticalHorizontal(v, h) => path!(Rect::VerticalHorizontal(#v, #h)),
  685. Rect::TopHorizontalBottom(t, h, b) => path!(Rect::TopHorizontalBottom(#t, #h, #b)),
  686. Rect::TopRightBottomLeft(t, r, b, l) => path!(Rect::TopRightBottomLeft(#t, #r, #b, #l)),
  687. });
  688. }
  689. }
  690. impl ToTokens for LengthPercentage {
  691. fn to_tokens(&self, tokens: &mut TokenStream) {
  692. tokens.extend(match self {
  693. LengthPercentage::Length(v) => path!(LengthPercentage::Length(#v)),
  694. LengthPercentage::Percentage(v) => path!(LengthPercentage::Percentage(#v)),
  695. });
  696. }
  697. }
  698. impl ToTokens for AutoLengthPercentage {
  699. fn to_tokens(&self, tokens: &mut TokenStream) {
  700. tokens.extend(match self {
  701. AutoLengthPercentage::LengthPercentage(v) => {
  702. path!(AutoLengthPercentage::LengthPercentage(#v))
  703. }
  704. AutoLengthPercentage::Auto => path!(AutoLengthPercentage::Auto),
  705. });
  706. }
  707. }
  708. impl ToTokens for LineStyle {
  709. fn to_tokens(&self, tokens: &mut TokenStream) {
  710. tokens.extend(match self {
  711. LineStyle::None => path!(LineStyle::None),
  712. LineStyle::Hidden => path!(LineStyle::Hidden),
  713. LineStyle::Dotted => path!(LineStyle::Dotted),
  714. LineStyle::Dashed => path!(LineStyle::Dashed),
  715. LineStyle::Solid => path!(LineStyle::Solid),
  716. LineStyle::Double => path!(LineStyle::Double),
  717. LineStyle::Groove => path!(LineStyle::Groove),
  718. LineStyle::Ridge => path!(LineStyle::Ridge),
  719. LineStyle::Inset => path!(LineStyle::Inset),
  720. LineStyle::Outset => path!(LineStyle::Outset),
  721. })
  722. }
  723. }
  724. impl ToTokens for LineWidth {
  725. fn to_tokens(&self, tokens: &mut TokenStream) {
  726. tokens.extend(match self {
  727. LineWidth::Length(length) => path!(LineWidth::Length(#length)),
  728. LineWidth::Thin => path!(LineWidth::Thin),
  729. LineWidth::Medium => path!(LineWidth::Medium),
  730. LineWidth::Thick => path!(LineWidth::Thick),
  731. })
  732. }
  733. }
  734. impl ToTokens for LineHeight {
  735. fn to_tokens(&self, tokens: &mut TokenStream) {
  736. self.0.to_tokens(tokens)
  737. }
  738. }
  739. impl ToTokens for ListStyleType {
  740. fn to_tokens(&self, tokens: &mut TokenStream) {
  741. tokens.extend(match self {
  742. ListStyleType::Disc => path!(ListStyleType::Disc),
  743. ListStyleType::Circle => path!(ListStyleType::Circle),
  744. ListStyleType::Square => path!(ListStyleType::Square),
  745. ListStyleType::Decimal => path!(ListStyleType::Decimal),
  746. ListStyleType::DecimalLeadingZero => path!(ListStyleType::DecimalLeadingZero),
  747. ListStyleType::LowerRoman => path!(ListStyleType::LowerRoman),
  748. ListStyleType::UpperRoman => path!(ListStyleType::UpperRoman),
  749. ListStyleType::LowerGreek => path!(ListStyleType::LowerGreek),
  750. ListStyleType::UpperGreek => path!(ListStyleType::UpperGreek),
  751. ListStyleType::LowerLatin => path!(ListStyleType::LowerLatin),
  752. ListStyleType::UpperLatin => path!(ListStyleType::UpperLatin),
  753. ListStyleType::Armenian => path!(ListStyleType::Armenian),
  754. ListStyleType::Georgian => path!(ListStyleType::Georgian),
  755. ListStyleType::LowerAlpha => path!(ListStyleType::LowerAlpha),
  756. ListStyleType::UpperAlpha => path!(ListStyleType::UpperAlpha),
  757. ListStyleType::None => path!(ListStyleType::None),
  758. })
  759. }
  760. }
  761. impl ToTokens for Position {
  762. fn to_tokens(&self, tokens: &mut TokenStream) {
  763. tokens.extend(match self {
  764. Position::Static => path!(Position::Static),
  765. Position::Relative => path!(Position::Relative),
  766. Position::Absolute => path!(Position::Absolute),
  767. Position::Fixed => path!(Position::Fixed),
  768. })
  769. }
  770. }
  771. impl ToTokens for Resize {
  772. fn to_tokens(&self, tokens: &mut TokenStream) {
  773. tokens.extend(match self {
  774. Resize::None => path!(Resize::None),
  775. Resize::Both => path!(Resize::Both),
  776. Resize::Horizontal => path!(Resize::Horizontal),
  777. Resize::Vertical => path!(Resize::Vertical),
  778. })
  779. }
  780. }
  781. impl ToTokens for WhiteSpace {
  782. fn to_tokens(&self, tokens: &mut TokenStream) {
  783. tokens.extend(match self {
  784. WhiteSpace::Normal => path!(WhiteSpace::Normal),
  785. WhiteSpace::Pre => path!(WhiteSpace::Pre),
  786. WhiteSpace::Nowrap => path!(WhiteSpace::Nowrap),
  787. WhiteSpace::PreWrap => path!(WhiteSpace::PreWrap),
  788. WhiteSpace::PreLine => path!(WhiteSpace::PreLine),
  789. })
  790. }
  791. }
  792. impl ToTokens for WidthHeight {
  793. fn to_tokens(&self, tokens: &mut TokenStream) {
  794. tokens.extend(match self {
  795. WidthHeight::Auto => path!(WidthHeight::Auto),
  796. WidthHeight::LengthPercentage(v) => path!(WidthHeight::LengthPercentage(#v)),
  797. WidthHeight::MinContent => path!(WidthHeight::MinContent),
  798. WidthHeight::MaxContent => path!(WidthHeight::MaxContent),
  799. WidthHeight::FitContent(v) => path!(WidthHeight::FitContent(#v)),
  800. })
  801. }
  802. }
  803. impl ToTokens for MaxWidthHeight {
  804. fn to_tokens(&self, tokens: &mut TokenStream) {
  805. tokens.extend(match self {
  806. MaxWidthHeight::None => path!(MaxWidthHeight::None),
  807. MaxWidthHeight::LengthPercentage(v) => path!(MaxWidthHeight::LengthPercentage(#v)),
  808. MaxWidthHeight::MinContent => path!(MaxWidthHeight::MinContent),
  809. MaxWidthHeight::MaxContent => path!(MaxWidthHeight::MaxContent),
  810. MaxWidthHeight::FitContent(v) => path!(MaxWidthHeight::FitContent(#v)),
  811. })
  812. }
  813. }
  814. impl ToTokens for Width21 {
  815. fn to_tokens(&self, tokens: &mut TokenStream) {
  816. tokens.extend(match self {
  817. Width21::Auto => path!(Width21::Auto),
  818. Width21::LengthPercentage(v) => path!(Width21::LengthPercentage(#v)),
  819. })
  820. }
  821. }
  822. impl ToTokens for Shadow {
  823. fn to_tokens(&self, tokens: &mut TokenStream) {
  824. let color = match self.color.as_ref() {
  825. Some(color) => quote!(Some(#color)),
  826. None => quote!(None),
  827. };
  828. let length = &self.length;
  829. let inset = &self.inset;
  830. tokens.extend(quote! {
  831. style::Shadow {
  832. color: #color,
  833. length: #length,
  834. inset: #inset,
  835. }
  836. })
  837. }
  838. }
  839. impl ToTokens for ShadowLength {
  840. fn to_tokens(&self, tokens: &mut TokenStream) {
  841. tokens.extend(match self {
  842. ShadowLength::Offsets {
  843. vertical,
  844. horizontal,
  845. } => path!(ShadowLength::Offsets {
  846. vertical: #vertical,
  847. horizontal: #horizontal,
  848. }),
  849. ShadowLength::OffsetsBlur {
  850. vertical,
  851. horizontal,
  852. blur,
  853. } => path!(ShadowLength::OffsetsBlur {
  854. vertical: #vertical,
  855. horizontal: #horizontal,
  856. blur: #blur,
  857. }),
  858. ShadowLength::OffsetsBlurSpread {
  859. vertical,
  860. horizontal,
  861. blur,
  862. spread,
  863. } => path!(ShadowLength::Offsets {
  864. vertical: #vertical,
  865. horizontal: #horizontal,
  866. blur: #blur,
  867. spread: #spread,
  868. }),
  869. })
  870. }
  871. }
  872. impl ToTokens for TextAlign {
  873. fn to_tokens(&self, tokens: &mut TokenStream) {
  874. tokens.extend(match self {
  875. TextAlign::Left => path!(TextAlign::Left),
  876. TextAlign::Right => path!(TextAlign::Right),
  877. TextAlign::Center => path!(TextAlign::Center),
  878. TextAlign::Justify => path!(TextAlign::Justify),
  879. });
  880. }
  881. }
  882. impl ToTokens for Length {
  883. fn to_tokens(&self, tokens: &mut TokenStream) {
  884. tokens.extend(match self {
  885. Length::Em(v) => path!(Length::Em(#v)),
  886. Length::Ex(v) => path!(Length::Ex(#v)),
  887. Length::In(v) => path!(Length::In(#v)),
  888. Length::Cm(v) => path!(Length::Cm(#v)),
  889. Length::Mm(v) => path!(Length::Mm(#v)),
  890. Length::Pt(v) => path!(Length::Pt(#v)),
  891. Length::Pc(v) => path!(Length::Pc(#v)),
  892. Length::Px(v) => path!(Length::Px(#v)),
  893. Length::Zero => path!(Length::Zero),
  894. })
  895. }
  896. }
  897. impl ToTokens for Percentage {
  898. fn to_tokens(&self, tokens: &mut TokenStream) {
  899. let val = self.0;
  900. tokens.extend(path!(Percentage(#val)));
  901. }
  902. }
  903. impl ToTokens for DynamicColor {
  904. fn to_tokens(&self, tokens: &mut TokenStream) {
  905. tokens.extend(match self {
  906. DynamicColor::Dynamic(block) => path!(DynamicColor::Literal(#block)),
  907. DynamicColor::Literal(color) => path!(DynamicColor::Literal(#color)),
  908. })
  909. }
  910. }
  911. impl ToTokens for Color {
  912. fn to_tokens(&self, tokens: &mut TokenStream) {
  913. tokens.extend(match self {
  914. Color::HexRGB(r, g, b) => path!(Color::HexRGB(#r, #g, #b)),
  915. Color::HexRGBA(r, g, b, a) => path!(Color::HexRGB(#r, #g, #b, #a)),
  916. Color::HSL(h, s, l) => path!(Color::HSL(#h, #s, #l)),
  917. Color::HSLA(h, s, l, a) => path!(Color::HSLA(#h, #s, #l, #a)),
  918. Color::IndianRed => path!(Color::IndianRed),
  919. Color::LightCoral => path!(Color::LightCoral),
  920. Color::Salmon => path!(Color::Salmon),
  921. Color::DarkSalmon => path!(Color::DarkSalmon),
  922. Color::LightSalmon => path!(Color::LightSalmon),
  923. Color::Crimson => path!(Color::Crimson),
  924. Color::Red => path!(Color::Red),
  925. Color::FireBrick => path!(Color::FireBrick),
  926. Color::DarkRed => path!(Color::DarkRed),
  927. Color::Pink => path!(Color::Pink),
  928. Color::LightPink => path!(Color::LightPink),
  929. Color::HotPink => path!(Color::HotPink),
  930. Color::DeepPink => path!(Color::DeepPink),
  931. Color::MediumVioletRed => path!(Color::MediumVioletRed),
  932. Color::PaleVioletRed => path!(Color::PaleVioletRed),
  933. Color::Coral => path!(Color::Coral),
  934. Color::Tomato => path!(Color::Tomato),
  935. Color::OrangeRed => path!(Color::OrangeRed),
  936. Color::DarkOrange => path!(Color::DarkOrange),
  937. Color::Orange => path!(Color::Orange),
  938. Color::Gold => path!(Color::Gold),
  939. Color::Yellow => path!(Color::Yellow),
  940. Color::LightYellow => path!(Color::LightYellow),
  941. Color::LemonChiffon => path!(Color::LemonChiffon),
  942. Color::LightGoldenrodYellow => path!(Color::LightGoldenrodYellow),
  943. Color::PapayaWhip => path!(Color::PapayaWhip),
  944. Color::Moccasin => path!(Color::Moccasin),
  945. Color::PeachPuff => path!(Color::PeachPuff),
  946. Color::PaleGoldenrod => path!(Color::PaleGoldenrod),
  947. Color::Khaki => path!(Color::Khaki),
  948. Color::DarkKhaki => path!(Color::DarkKhaki),
  949. Color::Lavender => path!(Color::Lavender),
  950. Color::Thistle => path!(Color::Thistle),
  951. Color::Plum => path!(Color::Plum),
  952. Color::Violet => path!(Color::Violet),
  953. Color::Orchid => path!(Color::Orchid),
  954. Color::Fuchsia => path!(Color::Fuchsia),
  955. Color::Magenta => path!(Color::Magenta),
  956. Color::MediumOrchid => path!(Color::MediumOrchid),
  957. Color::MediumPurple => path!(Color::MediumPurple),
  958. Color::RebeccaPurple => path!(Color::RebeccaPurple),
  959. Color::BlueViolet => path!(Color::BlueViolet),
  960. Color::DarkViolet => path!(Color::DarkViolet),
  961. Color::DarkOrchid => path!(Color::DarkOrchid),
  962. Color::DarkMagenta => path!(Color::DarkMagenta),
  963. Color::Purple => path!(Color::Purple),
  964. Color::Indigo => path!(Color::Indigo),
  965. Color::SlateBlue => path!(Color::SlateBlue),
  966. Color::DarkSlateBlue => path!(Color::DarkSlateBlue),
  967. Color::MediumSlateBlue => path!(Color::MediumSlateBlue),
  968. Color::GreenYellow => path!(Color::GreenYellow),
  969. Color::Chartreuse => path!(Color::Chartreuse),
  970. Color::LawnGreen => path!(Color::LawnGreen),
  971. Color::Lime => path!(Color::Lime),
  972. Color::LimeGreen => path!(Color::LimeGreen),
  973. Color::PaleGreen => path!(Color::PaleGreen),
  974. Color::LightGreen => path!(Color::LightGreen),
  975. Color::MediumSpringGreen => path!(Color::MediumSpringGreen),
  976. Color::SpringGreen => path!(Color::SpringGreen),
  977. Color::MediumSeaGreen => path!(Color::MediumSeaGreen),
  978. Color::SeaGreen => path!(Color::SeaGreen),
  979. Color::ForestGreen => path!(Color::ForestGreen),
  980. Color::Green => path!(Color::Green),
  981. Color::DarkGreen => path!(Color::DarkGreen),
  982. Color::YellowGreen => path!(Color::YellowGreen),
  983. Color::OliveDrab => path!(Color::OliveDrab),
  984. Color::Olive => path!(Color::Olive),
  985. Color::DarkOliveGreen => path!(Color::DarkOliveGreen),
  986. Color::MediumAquamarine => path!(Color::MediumAquamarine),
  987. Color::DarkSeaGreen => path!(Color::DarkSeaGreen),
  988. Color::LightSeaGreen => path!(Color::LightSeaGreen),
  989. Color::DarkCyan => path!(Color::DarkCyan),
  990. Color::Teal => path!(Color::Teal),
  991. Color::Aqua => path!(Color::Aqua),
  992. Color::Cyan => path!(Color::Cyan),
  993. Color::LightCyan => path!(Color::LightCyan),
  994. Color::PaleTurquoise => path!(Color::PaleTurquoise),
  995. Color::Aquamarine => path!(Color::Aquamarine),
  996. Color::Turquoise => path!(Color::Turquoise),
  997. Color::MediumTurquoise => path!(Color::MediumTurquoise),
  998. Color::DarkTurquoise => path!(Color::DarkTurquoise),
  999. Color::CadetBlue => path!(Color::CadetBlue),
  1000. Color::SteelBlue => path!(Color::SteelBlue),
  1001. Color::LightSteelBlue => path!(Color::LightSteelBlue),
  1002. Color::PowderBlue => path!(Color::PowderBlue),
  1003. Color::LightBlue => path!(Color::LightBlue),
  1004. Color::SkyBlue => path!(Color::SkyBlue),
  1005. Color::LightSkyBlue => path!(Color::LightSkyBlue),
  1006. Color::DeepSkyBlue => path!(Color::DeepSkyBlue),
  1007. Color::DodgerBlue => path!(Color::DodgerBlue),
  1008. Color::CornflowerBlue => path!(Color::CornflowerBlue),
  1009. Color::RoyalBlue => path!(Color::RoyalBlue),
  1010. Color::Blue => path!(Color::Blue),
  1011. Color::MediumBlue => path!(Color::MediumBlue),
  1012. Color::DarkBlue => path!(Color::DarkBlue),
  1013. Color::Navy => path!(Color::Navy),
  1014. Color::MidnightBlue => path!(Color::MidnightBlue),
  1015. Color::Cornsilk => path!(Color::Cornsilk),
  1016. Color::BlanchedAlmond => path!(Color::BlanchedAlmond),
  1017. Color::Bisque => path!(Color::Bisque),
  1018. Color::NavajoWhite => path!(Color::NavajoWhite),
  1019. Color::Wheat => path!(Color::Wheat),
  1020. Color::BurlyWood => path!(Color::BurlyWood),
  1021. Color::Tan => path!(Color::Tan),
  1022. Color::RosyBrown => path!(Color::RosyBrown),
  1023. Color::SandyBrown => path!(Color::SandyBrown),
  1024. Color::Goldenrod => path!(Color::Goldenrod),
  1025. Color::DarkGoldenrod => path!(Color::DarkGoldenrod),
  1026. Color::Peru => path!(Color::Peru),
  1027. Color::Chocolate => path!(Color::Chocolate),
  1028. Color::SaddleBrown => path!(Color::SaddleBrown),
  1029. Color::Sienna => path!(Color::Sienna),
  1030. Color::Brown => path!(Color::Brown),
  1031. Color::Maroon => path!(Color::Maroon),
  1032. Color::White => path!(Color::White),
  1033. Color::Snow => path!(Color::Snow),
  1034. Color::HoneyDew => path!(Color::HoneyDew),
  1035. Color::MintCream => path!(Color::MintCream),
  1036. Color::Azure => path!(Color::Azure),
  1037. Color::AliceBlue => path!(Color::AliceBlue),
  1038. Color::GhostWhite => path!(Color::GhostWhite),
  1039. Color::WhiteSmoke => path!(Color::WhiteSmoke),
  1040. Color::SeaShell => path!(Color::SeaShell),
  1041. Color::Beige => path!(Color::Beige),
  1042. Color::OldLace => path!(Color::OldLace),
  1043. Color::FloralWhite => path!(Color::FloralWhite),
  1044. Color::Ivory => path!(Color::Ivory),
  1045. Color::AntiqueWhite => path!(Color::AntiqueWhite),
  1046. Color::Linen => path!(Color::Linen),
  1047. Color::LavenderBlush => path!(Color::LavenderBlush),
  1048. Color::MistyRose => path!(Color::MistyRose),
  1049. Color::Gainsboro => path!(Color::Gainsboro),
  1050. Color::LightGray => path!(Color::LightGray),
  1051. Color::Silver => path!(Color::Silver),
  1052. Color::DarkGray => path!(Color::DarkGray),
  1053. Color::Gray => path!(Color::Gray),
  1054. Color::DimGray => path!(Color::DimGray),
  1055. Color::LightSlateGray => path!(Color::LightSlateGray),
  1056. Color::SlateGray => path!(Color::SlateGray),
  1057. Color::DarkSlateGray => path!(Color::DarkSlateGray),
  1058. Color::Black => path!(Color::Black),
  1059. })
  1060. }
  1061. }
  1062. // Generic containers
  1063. impl<T> ToTokens for NonemptyCommaList<T>
  1064. where
  1065. T: ToTokens,
  1066. {
  1067. fn to_tokens(&self, tokens: &mut TokenStream) {
  1068. let first = &self.first;
  1069. let rest = &self.rest;
  1070. tokens.extend(path! {
  1071. NonemptyCommaList {
  1072. first: #first,
  1073. rest: vec![#(#rest),*],
  1074. }
  1075. })
  1076. }
  1077. }
  1078. impl<T> ToTokens for SingleOrDouble<T>
  1079. where
  1080. T: ToTokens,
  1081. {
  1082. fn to_tokens(&self, tokens: &mut TokenStream) {
  1083. tokens.extend(match self {
  1084. SingleOrDouble::Single(t) => path!(SingleOrDouble::Single(#t)),
  1085. SingleOrDouble::Double { vert, horiz } => path!(SingleOrDouble::Double {
  1086. vert: #vert,
  1087. horiz: #horiz,
  1088. }),
  1089. })
  1090. }
  1091. }