#![cfg(unix)]
use libhelium_sys::*;
use std::env;
use std::error::Error;
use std::ffi::OsString;
use std::mem::{align_of, size_of};
use std::path::Path;
use std::process::{Command, Stdio};
use std::str;
use tempfile::Builder;
static PACKAGES: &[&str] = &["libhelium-1"];
#[derive(Clone, Debug)]
struct Compiler {
pub args: Vec<String>,
}
impl Compiler {
pub fn new() -> Result<Self, Box<dyn Error>> {
let mut args = get_var("CC", "cc")?;
args.push("-Wno-deprecated-declarations".to_owned());
args.push("-std=c11".to_owned());
args.push("-D__USE_MINGW_ANSI_STDIO".to_owned());
args.extend(get_var("CFLAGS", "")?);
args.extend(get_var("CPPFLAGS", "")?);
args.extend(pkg_config_cflags(PACKAGES)?);
Ok(Self { args })
}
pub fn compile(&self, src: &Path, out: &Path) -> Result<(), Box<dyn Error>> {
let mut cmd = self.to_command();
cmd.arg(src);
cmd.arg("-o");
cmd.arg(out);
let status = cmd.spawn()?.wait()?;
if !status.success() {
return Err(format!("compilation command {cmd:?} failed, {status}").into());
}
Ok(())
}
fn to_command(&self) -> Command {
let mut cmd = Command::new(&self.args[0]);
cmd.args(&self.args[1..]);
cmd
}
}
fn get_var(name: &str, default: &str) -> Result<Vec<String>, Box<dyn Error>> {
match env::var(name) {
Ok(value) => Ok(shell_words::split(&value)?),
Err(env::VarError::NotPresent) => Ok(shell_words::split(default)?),
Err(err) => Err(format!("{name} {err}").into()),
}
}
fn pkg_config_cflags(packages: &[&str]) -> Result<Vec<String>, Box<dyn Error>> {
if packages.is_empty() {
return Ok(Vec::new());
}
let pkg_config = env::var_os("PKG_CONFIG").unwrap_or_else(|| OsString::from("pkg-config"));
let mut cmd = Command::new(pkg_config);
cmd.arg("--cflags");
cmd.args(packages);
cmd.stderr(Stdio::inherit());
let out = cmd.output()?;
if !out.status.success() {
let (status, stdout) = (out.status, String::from_utf8_lossy(&out.stdout));
return Err(format!("command {cmd:?} failed, {status:?}\nstdout: {stdout}").into());
}
let stdout = str::from_utf8(&out.stdout)?;
Ok(shell_words::split(stdout.trim())?)
}
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
struct Layout {
size: usize,
alignment: usize,
}
#[derive(Copy, Clone, Debug, Default, Eq, PartialEq)]
struct Results {
passed: usize,
failed: usize,
}
impl Results {
fn record_passed(&mut self) {
self.passed += 1;
}
fn record_failed(&mut self) {
self.failed += 1;
}
fn summary(&self) -> String {
format!("{} passed; {} failed", self.passed, self.failed)
}
fn expect_total_success(&self) {
if self.failed == 0 {
println!("OK: {}", self.summary());
} else {
panic!("FAILED: {}", self.summary());
};
}
}
#[test]
fn cross_validate_constants_with_c() {
let mut c_constants: Vec<(String, String)> = Vec::new();
for l in get_c_output("constant").unwrap().lines() {
let (name, value) = l.split_once(';').expect("Missing ';' separator");
c_constants.push((name.to_owned(), value.to_owned()));
}
let mut results = Results::default();
for ((rust_name, rust_value), (c_name, c_value)) in
RUST_CONSTANTS.iter().zip(c_constants.iter())
{
if rust_name != c_name {
results.record_failed();
eprintln!("Name mismatch:\nRust: {rust_name:?}\nC: {c_name:?}");
continue;
}
if rust_value != c_value {
results.record_failed();
eprintln!(
"Constant value mismatch for {rust_name}\nRust: {rust_value:?}\nC: {c_value:?}",
);
continue;
}
results.record_passed();
}
results.expect_total_success();
}
#[test]
fn cross_validate_layout_with_c() {
let mut c_layouts = Vec::new();
for l in get_c_output("layout").unwrap().lines() {
let (name, value) = l.split_once(';').expect("Missing first ';' separator");
let (size, alignment) = value.split_once(';').expect("Missing second ';' separator");
let size = size.parse().expect("Failed to parse size");
let alignment = alignment.parse().expect("Failed to parse alignment");
c_layouts.push((name.to_owned(), Layout { size, alignment }));
}
let mut results = Results::default();
for ((rust_name, rust_layout), (c_name, c_layout)) in RUST_LAYOUTS.iter().zip(c_layouts.iter())
{
if rust_name != c_name {
results.record_failed();
eprintln!("Name mismatch:\nRust: {rust_name:?}\nC: {c_name:?}");
continue;
}
if rust_layout != c_layout {
results.record_failed();
eprintln!("Layout mismatch for {rust_name}\nRust: {rust_layout:?}\nC: {c_layout:?}",);
continue;
}
results.record_passed();
}
results.expect_total_success();
}
fn get_c_output(name: &str) -> Result<String, Box<dyn Error>> {
let tmpdir = Builder::new().prefix("abi").tempdir()?;
let exe = tmpdir.path().join(name);
let c_file = Path::new("tests").join(name).with_extension("c");
let cc = Compiler::new().expect("configured compiler");
cc.compile(&c_file, &exe)?;
let mut cmd = Command::new(exe);
cmd.stderr(Stdio::inherit());
let out = cmd.output()?;
if !out.status.success() {
let (status, stdout) = (out.status, String::from_utf8_lossy(&out.stdout));
return Err(format!("command {cmd:?} failed, {status:?}\nstdout: {stdout}").into());
}
Ok(String::from_utf8(out.stdout)?)
}
const RUST_LAYOUTS: &[(&str, Layout)] = &[
(
"HeAboutWindow",
Layout {
size: size_of::<HeAboutWindow>(),
alignment: align_of::<HeAboutWindow>(),
},
),
(
"HeAboutWindowClass",
Layout {
size: size_of::<HeAboutWindowClass>(),
alignment: align_of::<HeAboutWindowClass>(),
},
),
(
"HeAboutWindowLicenses",
Layout {
size: size_of::<HeAboutWindowLicenses>(),
alignment: align_of::<HeAboutWindowLicenses>(),
},
),
(
"HeAnimation",
Layout {
size: size_of::<HeAnimation>(),
alignment: align_of::<HeAnimation>(),
},
),
(
"HeAnimationClass",
Layout {
size: size_of::<HeAnimationClass>(),
alignment: align_of::<HeAnimationClass>(),
},
),
(
"HeAnimationState",
Layout {
size: size_of::<HeAnimationState>(),
alignment: align_of::<HeAnimationState>(),
},
),
(
"HeAnimationTarget",
Layout {
size: size_of::<HeAnimationTarget>(),
alignment: align_of::<HeAnimationTarget>(),
},
),
(
"HeAnimationTargetClass",
Layout {
size: size_of::<HeAnimationTargetClass>(),
alignment: align_of::<HeAnimationTargetClass>(),
},
),
(
"HeAppBar",
Layout {
size: size_of::<HeAppBar>(),
alignment: align_of::<HeAppBar>(),
},
),
(
"HeAppBarClass",
Layout {
size: size_of::<HeAppBarClass>(),
alignment: align_of::<HeAppBarClass>(),
},
),
(
"HeApplication",
Layout {
size: size_of::<HeApplication>(),
alignment: align_of::<HeApplication>(),
},
),
(
"HeApplicationClass",
Layout {
size: size_of::<HeApplicationClass>(),
alignment: align_of::<HeApplicationClass>(),
},
),
(
"HeApplicationWindow",
Layout {
size: size_of::<HeApplicationWindow>(),
alignment: align_of::<HeApplicationWindow>(),
},
),
(
"HeApplicationWindowClass",
Layout {
size: size_of::<HeApplicationWindowClass>(),
alignment: align_of::<HeApplicationWindowClass>(),
},
),
(
"HeAvatar",
Layout {
size: size_of::<HeAvatar>(),
alignment: align_of::<HeAvatar>(),
},
),
(
"HeAvatarClass",
Layout {
size: size_of::<HeAvatarClass>(),
alignment: align_of::<HeAvatarClass>(),
},
),
(
"HeAvatarStatusColor",
Layout {
size: size_of::<HeAvatarStatusColor>(),
alignment: align_of::<HeAvatarStatusColor>(),
},
),
(
"HeBadge",
Layout {
size: size_of::<HeBadge>(),
alignment: align_of::<HeBadge>(),
},
),
(
"HeBadgeClass",
Layout {
size: size_of::<HeBadgeClass>(),
alignment: align_of::<HeBadgeClass>(),
},
),
(
"HeBanner",
Layout {
size: size_of::<HeBanner>(),
alignment: align_of::<HeBanner>(),
},
),
(
"HeBannerClass",
Layout {
size: size_of::<HeBannerClass>(),
alignment: align_of::<HeBannerClass>(),
},
),
(
"HeBannerStyle",
Layout {
size: size_of::<HeBannerStyle>(),
alignment: align_of::<HeBannerStyle>(),
},
),
(
"HeBin",
Layout {
size: size_of::<HeBin>(),
alignment: align_of::<HeBin>(),
},
),
(
"HeBinClass",
Layout {
size: size_of::<HeBinClass>(),
alignment: align_of::<HeBinClass>(),
},
),
(
"HeBottomBar",
Layout {
size: size_of::<HeBottomBar>(),
alignment: align_of::<HeBottomBar>(),
},
),
(
"HeBottomBarClass",
Layout {
size: size_of::<HeBottomBarClass>(),
alignment: align_of::<HeBottomBarClass>(),
},
),
(
"HeBottomBarFloatingPosition",
Layout {
size: size_of::<HeBottomBarFloatingPosition>(),
alignment: align_of::<HeBottomBarFloatingPosition>(),
},
),
(
"HeBottomBarMode",
Layout {
size: size_of::<HeBottomBarMode>(),
alignment: align_of::<HeBottomBarMode>(),
},
),
(
"HeBottomBarPosition",
Layout {
size: size_of::<HeBottomBarPosition>(),
alignment: align_of::<HeBottomBarPosition>(),
},
),
(
"HeBottomBarStyle",
Layout {
size: size_of::<HeBottomBarStyle>(),
alignment: align_of::<HeBottomBarStyle>(),
},
),
(
"HeBottomSheet",
Layout {
size: size_of::<HeBottomSheet>(),
alignment: align_of::<HeBottomSheet>(),
},
),
(
"HeBottomSheetClass",
Layout {
size: size_of::<HeBottomSheetClass>(),
alignment: align_of::<HeBottomSheetClass>(),
},
),
(
"HeButton",
Layout {
size: size_of::<HeButton>(),
alignment: align_of::<HeButton>(),
},
),
(
"HeButtonClass",
Layout {
size: size_of::<HeButtonClass>(),
alignment: align_of::<HeButtonClass>(),
},
),
(
"HeButtonColor",
Layout {
size: size_of::<HeButtonColor>(),
alignment: align_of::<HeButtonColor>(),
},
),
(
"HeButtonContent",
Layout {
size: size_of::<HeButtonContent>(),
alignment: align_of::<HeButtonContent>(),
},
),
(
"HeButtonContentClass",
Layout {
size: size_of::<HeButtonContentClass>(),
alignment: align_of::<HeButtonContentClass>(),
},
),
(
"HeButtonSize",
Layout {
size: size_of::<HeButtonSize>(),
alignment: align_of::<HeButtonSize>(),
},
),
(
"HeButtonWidth",
Layout {
size: size_of::<HeButtonWidth>(),
alignment: align_of::<HeButtonWidth>(),
},
),
(
"HeCAM16Color",
Layout {
size: size_of::<HeCAM16Color>(),
alignment: align_of::<HeCAM16Color>(),
},
),
(
"HeCallbackAnimationTarget",
Layout {
size: size_of::<HeCallbackAnimationTarget>(),
alignment: align_of::<HeCallbackAnimationTarget>(),
},
),
(
"HeCallbackAnimationTargetClass",
Layout {
size: size_of::<HeCallbackAnimationTargetClass>(),
alignment: align_of::<HeCallbackAnimationTargetClass>(),
},
),
(
"HeCard",
Layout {
size: size_of::<HeCard>(),
alignment: align_of::<HeCard>(),
},
),
(
"HeCardClass",
Layout {
size: size_of::<HeCardClass>(),
alignment: align_of::<HeCardClass>(),
},
),
(
"HeCardLayout",
Layout {
size: size_of::<HeCardLayout>(),
alignment: align_of::<HeCardLayout>(),
},
),
(
"HeCardType",
Layout {
size: size_of::<HeCardType>(),
alignment: align_of::<HeCardType>(),
},
),
(
"HeChip",
Layout {
size: size_of::<HeChip>(),
alignment: align_of::<HeChip>(),
},
),
(
"HeChipClass",
Layout {
size: size_of::<HeChipClass>(),
alignment: align_of::<HeChipClass>(),
},
),
(
"HeChipGroup",
Layout {
size: size_of::<HeChipGroup>(),
alignment: align_of::<HeChipGroup>(),
},
),
(
"HeChipGroupClass",
Layout {
size: size_of::<HeChipGroupClass>(),
alignment: align_of::<HeChipGroupClass>(),
},
),
(
"HeChipGroupMode",
Layout {
size: size_of::<HeChipGroupMode>(),
alignment: align_of::<HeChipGroupMode>(),
},
),
(
"HeColors",
Layout {
size: size_of::<HeColors>(),
alignment: align_of::<HeColors>(),
},
),
(
"HeContentBlock",
Layout {
size: size_of::<HeContentBlock>(),
alignment: align_of::<HeContentBlock>(),
},
),
(
"HeContentBlockClass",
Layout {
size: size_of::<HeContentBlockClass>(),
alignment: align_of::<HeContentBlockClass>(),
},
),
(
"HeContentBlockImage",
Layout {
size: size_of::<HeContentBlockImage>(),
alignment: align_of::<HeContentBlockImage>(),
},
),
(
"HeContentBlockImageClass",
Layout {
size: size_of::<HeContentBlockImageClass>(),
alignment: align_of::<HeContentBlockImageClass>(),
},
),
(
"HeContentBlockImageCluster",
Layout {
size: size_of::<HeContentBlockImageCluster>(),
alignment: align_of::<HeContentBlockImageCluster>(),
},
),
(
"HeContentBlockImageClusterClass",
Layout {
size: size_of::<HeContentBlockImageClusterClass>(),
alignment: align_of::<HeContentBlockImageClusterClass>(),
},
),
(
"HeContentBlockImageClusterImagePosition",
Layout {
size: size_of::<HeContentBlockImageClusterImagePosition>(),
alignment: align_of::<HeContentBlockImageClusterImagePosition>(),
},
),
(
"HeContentList",
Layout {
size: size_of::<HeContentList>(),
alignment: align_of::<HeContentList>(),
},
),
(
"HeContentListClass",
Layout {
size: size_of::<HeContentListClass>(),
alignment: align_of::<HeContentListClass>(),
},
),
(
"HeContentScheme",
Layout {
size: size_of::<HeContentScheme>(),
alignment: align_of::<HeContentScheme>(),
},
),
(
"HeContentSchemeClass",
Layout {
size: size_of::<HeContentSchemeClass>(),
alignment: align_of::<HeContentSchemeClass>(),
},
),
(
"HeContrast",
Layout {
size: size_of::<HeContrast>(),
alignment: align_of::<HeContrast>(),
},
),
(
"HeContrastClass",
Layout {
size: size_of::<HeContrastClass>(),
alignment: align_of::<HeContrastClass>(),
},
),
(
"HeContrastCurve",
Layout {
size: size_of::<HeContrastCurve>(),
alignment: align_of::<HeContrastCurve>(),
},
),
(
"HeContrastCurveClass",
Layout {
size: size_of::<HeContrastCurveClass>(),
alignment: align_of::<HeContrastCurveClass>(),
},
),
(
"HeDatePicker",
Layout {
size: size_of::<HeDatePicker>(),
alignment: align_of::<HeDatePicker>(),
},
),
(
"HeDatePickerClass",
Layout {
size: size_of::<HeDatePickerClass>(),
alignment: align_of::<HeDatePickerClass>(),
},
),
(
"HeDefaultScheme",
Layout {
size: size_of::<HeDefaultScheme>(),
alignment: align_of::<HeDefaultScheme>(),
},
),
(
"HeDefaultSchemeClass",
Layout {
size: size_of::<HeDefaultSchemeClass>(),
alignment: align_of::<HeDefaultSchemeClass>(),
},
),
(
"HeDesktop",
Layout {
size: size_of::<HeDesktop>(),
alignment: align_of::<HeDesktop>(),
},
),
(
"HeDesktopClass",
Layout {
size: size_of::<HeDesktopClass>(),
alignment: align_of::<HeDesktopClass>(),
},
),
(
"HeDesktopColorScheme",
Layout {
size: size_of::<HeDesktopColorScheme>(),
alignment: align_of::<HeDesktopColorScheme>(),
},
),
(
"HeDesktopEnsorScheme",
Layout {
size: size_of::<HeDesktopEnsorScheme>(),
alignment: align_of::<HeDesktopEnsorScheme>(),
},
),
(
"HeDialog",
Layout {
size: size_of::<HeDialog>(),
alignment: align_of::<HeDialog>(),
},
),
(
"HeDialogClass",
Layout {
size: size_of::<HeDialogClass>(),
alignment: align_of::<HeDialogClass>(),
},
),
(
"HeDivider",
Layout {
size: size_of::<HeDivider>(),
alignment: align_of::<HeDivider>(),
},
),
(
"HeDividerClass",
Layout {
size: size_of::<HeDividerClass>(),
alignment: align_of::<HeDividerClass>(),
},
),
(
"HeDropdown",
Layout {
size: size_of::<HeDropdown>(),
alignment: align_of::<HeDropdown>(),
},
),
(
"HeDropdownClass",
Layout {
size: size_of::<HeDropdownClass>(),
alignment: align_of::<HeDropdownClass>(),
},
),
(
"HeDynamicColor",
Layout {
size: size_of::<HeDynamicColor>(),
alignment: align_of::<HeDynamicColor>(),
},
),
(
"HeDynamicColorClass",
Layout {
size: size_of::<HeDynamicColorClass>(),
alignment: align_of::<HeDynamicColorClass>(),
},
),
(
"HeDynamicScheme",
Layout {
size: size_of::<HeDynamicScheme>(),
alignment: align_of::<HeDynamicScheme>(),
},
),
(
"HeDynamicSchemeClass",
Layout {
size: size_of::<HeDynamicSchemeClass>(),
alignment: align_of::<HeDynamicSchemeClass>(),
},
),
(
"HeEasing",
Layout {
size: size_of::<HeEasing>(),
alignment: align_of::<HeEasing>(),
},
),
(
"HeEmptyPage",
Layout {
size: size_of::<HeEmptyPage>(),
alignment: align_of::<HeEmptyPage>(),
},
),
(
"HeEmptyPageClass",
Layout {
size: size_of::<HeEmptyPageClass>(),
alignment: align_of::<HeEmptyPageClass>(),
},
),
(
"HeGroupedButton",
Layout {
size: size_of::<HeGroupedButton>(),
alignment: align_of::<HeGroupedButton>(),
},
),
(
"HeGroupedButtonClass",
Layout {
size: size_of::<HeGroupedButtonClass>(),
alignment: align_of::<HeGroupedButtonClass>(),
},
),
(
"HeGroupedButtonSize",
Layout {
size: size_of::<HeGroupedButtonSize>(),
alignment: align_of::<HeGroupedButtonSize>(),
},
),
(
"HeHCTColor",
Layout {
size: size_of::<HeHCTColor>(),
alignment: align_of::<HeHCTColor>(),
},
),
(
"HeKeyColor",
Layout {
size: size_of::<HeKeyColor>(),
alignment: align_of::<HeKeyColor>(),
},
),
(
"HeKeyColorClass",
Layout {
size: size_of::<HeKeyColorClass>(),
alignment: align_of::<HeKeyColorClass>(),
},
),
(
"HeLABColor",
Layout {
size: size_of::<HeLABColor>(),
alignment: align_of::<HeLABColor>(),
},
),
(
"HeLCHColor",
Layout {
size: size_of::<HeLCHColor>(),
alignment: align_of::<HeLCHColor>(),
},
),
(
"HeMiniContentBlock",
Layout {
size: size_of::<HeMiniContentBlock>(),
alignment: align_of::<HeMiniContentBlock>(),
},
),
(
"HeMiniContentBlockClass",
Layout {
size: size_of::<HeMiniContentBlockClass>(),
alignment: align_of::<HeMiniContentBlockClass>(),
},
),
(
"HeModifierBadge",
Layout {
size: size_of::<HeModifierBadge>(),
alignment: align_of::<HeModifierBadge>(),
},
),
(
"HeModifierBadgeAlignment",
Layout {
size: size_of::<HeModifierBadgeAlignment>(),
alignment: align_of::<HeModifierBadgeAlignment>(),
},
),
(
"HeModifierBadgeClass",
Layout {
size: size_of::<HeModifierBadgeClass>(),
alignment: align_of::<HeModifierBadgeClass>(),
},
),
(
"HeMonochromaticScheme",
Layout {
size: size_of::<HeMonochromaticScheme>(),
alignment: align_of::<HeMonochromaticScheme>(),
},
),
(
"HeMonochromaticSchemeClass",
Layout {
size: size_of::<HeMonochromaticSchemeClass>(),
alignment: align_of::<HeMonochromaticSchemeClass>(),
},
),
(
"HeMutedScheme",
Layout {
size: size_of::<HeMutedScheme>(),
alignment: align_of::<HeMutedScheme>(),
},
),
(
"HeMutedSchemeClass",
Layout {
size: size_of::<HeMutedSchemeClass>(),
alignment: align_of::<HeMutedSchemeClass>(),
},
),
(
"HeNavigationRail",
Layout {
size: size_of::<HeNavigationRail>(),
alignment: align_of::<HeNavigationRail>(),
},
),
(
"HeNavigationRailClass",
Layout {
size: size_of::<HeNavigationRailClass>(),
alignment: align_of::<HeNavigationRailClass>(),
},
),
(
"HeNavigationSection",
Layout {
size: size_of::<HeNavigationSection>(),
alignment: align_of::<HeNavigationSection>(),
},
),
(
"HeNavigationSectionClass",
Layout {
size: size_of::<HeNavigationSectionClass>(),
alignment: align_of::<HeNavigationSectionClass>(),
},
),
(
"HeOverlayButton",
Layout {
size: size_of::<HeOverlayButton>(),
alignment: align_of::<HeOverlayButton>(),
},
),
(
"HeOverlayButtonAlignment",
Layout {
size: size_of::<HeOverlayButtonAlignment>(),
alignment: align_of::<HeOverlayButtonAlignment>(),
},
),
(
"HeOverlayButtonClass",
Layout {
size: size_of::<HeOverlayButtonClass>(),
alignment: align_of::<HeOverlayButtonClass>(),
},
),
(
"HeOverlayButtonSize",
Layout {
size: size_of::<HeOverlayButtonSize>(),
alignment: align_of::<HeOverlayButtonSize>(),
},
),
(
"HeOverlayButtonTypeButton",
Layout {
size: size_of::<HeOverlayButtonTypeButton>(),
alignment: align_of::<HeOverlayButtonTypeButton>(),
},
),
(
"HeProgressBar",
Layout {
size: size_of::<HeProgressBar>(),
alignment: align_of::<HeProgressBar>(),
},
),
(
"HeProgressBarClass",
Layout {
size: size_of::<HeProgressBarClass>(),
alignment: align_of::<HeProgressBarClass>(),
},
),
(
"HePropertyAnimationTarget",
Layout {
size: size_of::<HePropertyAnimationTarget>(),
alignment: align_of::<HePropertyAnimationTarget>(),
},
),
(
"HePropertyAnimationTargetClass",
Layout {
size: size_of::<HePropertyAnimationTargetClass>(),
alignment: align_of::<HePropertyAnimationTargetClass>(),
},
),
(
"HeQuantizer",
Layout {
size: size_of::<HeQuantizer>(),
alignment: align_of::<HeQuantizer>(),
},
),
(
"HeQuantizerCelebi",
Layout {
size: size_of::<HeQuantizerCelebi>(),
alignment: align_of::<HeQuantizerCelebi>(),
},
),
(
"HeQuantizerCelebiClass",
Layout {
size: size_of::<HeQuantizerCelebiClass>(),
alignment: align_of::<HeQuantizerCelebiClass>(),
},
),
(
"HeQuantizerClass",
Layout {
size: size_of::<HeQuantizerClass>(),
alignment: align_of::<HeQuantizerClass>(),
},
),
(
"HeQuantizerMap",
Layout {
size: size_of::<HeQuantizerMap>(),
alignment: align_of::<HeQuantizerMap>(),
},
),
(
"HeQuantizerMapClass",
Layout {
size: size_of::<HeQuantizerMapClass>(),
alignment: align_of::<HeQuantizerMapClass>(),
},
),
(
"HeQuantizerResult",
Layout {
size: size_of::<HeQuantizerResult>(),
alignment: align_of::<HeQuantizerResult>(),
},
),
(
"HeQuantizerResultClass",
Layout {
size: size_of::<HeQuantizerResultClass>(),
alignment: align_of::<HeQuantizerResultClass>(),
},
),
(
"HeQuantizerWsmeans",
Layout {
size: size_of::<HeQuantizerWsmeans>(),
alignment: align_of::<HeQuantizerWsmeans>(),
},
),
(
"HeQuantizerWsmeansClass",
Layout {
size: size_of::<HeQuantizerWsmeansClass>(),
alignment: align_of::<HeQuantizerWsmeansClass>(),
},
),
(
"HeQuantizerWu",
Layout {
size: size_of::<HeQuantizerWu>(),
alignment: align_of::<HeQuantizerWu>(),
},
),
(
"HeQuantizerWuClass",
Layout {
size: size_of::<HeQuantizerWuClass>(),
alignment: align_of::<HeQuantizerWuClass>(),
},
),
(
"HeRGBColor",
Layout {
size: size_of::<HeRGBColor>(),
alignment: align_of::<HeRGBColor>(),
},
),
(
"HeSaladScheme",
Layout {
size: size_of::<HeSaladScheme>(),
alignment: align_of::<HeSaladScheme>(),
},
),
(
"HeSaladSchemeClass",
Layout {
size: size_of::<HeSaladSchemeClass>(),
alignment: align_of::<HeSaladSchemeClass>(),
},
),
(
"HeScheme",
Layout {
size: size_of::<HeScheme>(),
alignment: align_of::<HeScheme>(),
},
),
(
"HeSchemeClass",
Layout {
size: size_of::<HeSchemeClass>(),
alignment: align_of::<HeSchemeClass>(),
},
),
(
"HeSchemeVariant",
Layout {
size: size_of::<HeSchemeVariant>(),
alignment: align_of::<HeSchemeVariant>(),
},
),
(
"HeScore",
Layout {
size: size_of::<HeScore>(),
alignment: align_of::<HeScore>(),
},
),
(
"HeScoreAnnotatedColor",
Layout {
size: size_of::<HeScoreAnnotatedColor>(),
alignment: align_of::<HeScoreAnnotatedColor>(),
},
),
(
"HeScoreAnnotatedColorClass",
Layout {
size: size_of::<HeScoreAnnotatedColorClass>(),
alignment: align_of::<HeScoreAnnotatedColorClass>(),
},
),
(
"HeScoreClass",
Layout {
size: size_of::<HeScoreClass>(),
alignment: align_of::<HeScoreClass>(),
},
),
(
"HeSegmentedButton",
Layout {
size: size_of::<HeSegmentedButton>(),
alignment: align_of::<HeSegmentedButton>(),
},
),
(
"HeSegmentedButtonClass",
Layout {
size: size_of::<HeSegmentedButtonClass>(),
alignment: align_of::<HeSegmentedButtonClass>(),
},
),
(
"HeSettingsList",
Layout {
size: size_of::<HeSettingsList>(),
alignment: align_of::<HeSettingsList>(),
},
),
(
"HeSettingsListClass",
Layout {
size: size_of::<HeSettingsListClass>(),
alignment: align_of::<HeSettingsListClass>(),
},
),
(
"HeSettingsPage",
Layout {
size: size_of::<HeSettingsPage>(),
alignment: align_of::<HeSettingsPage>(),
},
),
(
"HeSettingsPageClass",
Layout {
size: size_of::<HeSettingsPageClass>(),
alignment: align_of::<HeSettingsPageClass>(),
},
),
(
"HeSettingsRow",
Layout {
size: size_of::<HeSettingsRow>(),
alignment: align_of::<HeSettingsRow>(),
},
),
(
"HeSettingsRowClass",
Layout {
size: size_of::<HeSettingsRowClass>(),
alignment: align_of::<HeSettingsRowClass>(),
},
),
(
"HeSettingsWindow",
Layout {
size: size_of::<HeSettingsWindow>(),
alignment: align_of::<HeSettingsWindow>(),
},
),
(
"HeSettingsWindowClass",
Layout {
size: size_of::<HeSettingsWindowClass>(),
alignment: align_of::<HeSettingsWindowClass>(),
},
),
(
"HeSideBar",
Layout {
size: size_of::<HeSideBar>(),
alignment: align_of::<HeSideBar>(),
},
),
(
"HeSideBarClass",
Layout {
size: size_of::<HeSideBarClass>(),
alignment: align_of::<HeSideBarClass>(),
},
),
(
"HeSlider",
Layout {
size: size_of::<HeSlider>(),
alignment: align_of::<HeSlider>(),
},
),
(
"HeSliderClass",
Layout {
size: size_of::<HeSliderClass>(),
alignment: align_of::<HeSliderClass>(),
},
),
(
"HeSpringAnimation",
Layout {
size: size_of::<HeSpringAnimation>(),
alignment: align_of::<HeSpringAnimation>(),
},
),
(
"HeSpringAnimationClass",
Layout {
size: size_of::<HeSpringAnimationClass>(),
alignment: align_of::<HeSpringAnimationClass>(),
},
),
(
"HeSpringParams",
Layout {
size: size_of::<HeSpringParams>(),
alignment: align_of::<HeSpringParams>(),
},
),
(
"HeSpringParamsClass",
Layout {
size: size_of::<HeSpringParamsClass>(),
alignment: align_of::<HeSpringParamsClass>(),
},
),
(
"HeStyleManager",
Layout {
size: size_of::<HeStyleManager>(),
alignment: align_of::<HeStyleManager>(),
},
),
(
"HeStyleManagerClass",
Layout {
size: size_of::<HeStyleManagerClass>(),
alignment: align_of::<HeStyleManagerClass>(),
},
),
(
"HeSwitch",
Layout {
size: size_of::<HeSwitch>(),
alignment: align_of::<HeSwitch>(),
},
),
(
"HeSwitchBar",
Layout {
size: size_of::<HeSwitchBar>(),
alignment: align_of::<HeSwitchBar>(),
},
),
(
"HeSwitchBarClass",
Layout {
size: size_of::<HeSwitchBarClass>(),
alignment: align_of::<HeSwitchBarClass>(),
},
),
(
"HeSwitchClass",
Layout {
size: size_of::<HeSwitchClass>(),
alignment: align_of::<HeSwitchClass>(),
},
),
(
"HeTab",
Layout {
size: size_of::<HeTab>(),
alignment: align_of::<HeTab>(),
},
),
(
"HeTabClass",
Layout {
size: size_of::<HeTabClass>(),
alignment: align_of::<HeTabClass>(),
},
),
(
"HeTabPage",
Layout {
size: size_of::<HeTabPage>(),
alignment: align_of::<HeTabPage>(),
},
),
(
"HeTabPageClass",
Layout {
size: size_of::<HeTabPageClass>(),
alignment: align_of::<HeTabPageClass>(),
},
),
(
"HeTabSwitcher",
Layout {
size: size_of::<HeTabSwitcher>(),
alignment: align_of::<HeTabSwitcher>(),
},
),
(
"HeTabSwitcherClass",
Layout {
size: size_of::<HeTabSwitcherClass>(),
alignment: align_of::<HeTabSwitcherClass>(),
},
),
(
"HeTabSwitcherTabBarBehavior",
Layout {
size: size_of::<HeTabSwitcherTabBarBehavior>(),
alignment: align_of::<HeTabSwitcherTabBarBehavior>(),
},
),
(
"HeTemperatureCache",
Layout {
size: size_of::<HeTemperatureCache>(),
alignment: align_of::<HeTemperatureCache>(),
},
),
(
"HeTemperatureCacheClass",
Layout {
size: size_of::<HeTemperatureCacheClass>(),
alignment: align_of::<HeTemperatureCacheClass>(),
},
),
(
"HeTextField",
Layout {
size: size_of::<HeTextField>(),
alignment: align_of::<HeTextField>(),
},
),
(
"HeTextFieldClass",
Layout {
size: size_of::<HeTextFieldClass>(),
alignment: align_of::<HeTextFieldClass>(),
},
),
(
"HeTimePicker",
Layout {
size: size_of::<HeTimePicker>(),
alignment: align_of::<HeTimePicker>(),
},
),
(
"HeTimePickerClass",
Layout {
size: size_of::<HeTimePickerClass>(),
alignment: align_of::<HeTimePickerClass>(),
},
),
(
"HeTimedAnimation",
Layout {
size: size_of::<HeTimedAnimation>(),
alignment: align_of::<HeTimedAnimation>(),
},
),
(
"HeTimedAnimationClass",
Layout {
size: size_of::<HeTimedAnimationClass>(),
alignment: align_of::<HeTimedAnimationClass>(),
},
),
(
"HeTip",
Layout {
size: size_of::<HeTip>(),
alignment: align_of::<HeTip>(),
},
),
(
"HeTipClass",
Layout {
size: size_of::<HeTipClass>(),
alignment: align_of::<HeTipClass>(),
},
),
(
"HeTipView",
Layout {
size: size_of::<HeTipView>(),
alignment: align_of::<HeTipView>(),
},
),
(
"HeTipViewClass",
Layout {
size: size_of::<HeTipViewClass>(),
alignment: align_of::<HeTipViewClass>(),
},
),
(
"HeTipViewStyle",
Layout {
size: size_of::<HeTipViewStyle>(),
alignment: align_of::<HeTipViewStyle>(),
},
),
(
"HeToast",
Layout {
size: size_of::<HeToast>(),
alignment: align_of::<HeToast>(),
},
),
(
"HeToastClass",
Layout {
size: size_of::<HeToastClass>(),
alignment: align_of::<HeToastClass>(),
},
),
(
"HeTonalPalette",
Layout {
size: size_of::<HeTonalPalette>(),
alignment: align_of::<HeTonalPalette>(),
},
),
(
"HeTonalPaletteClass",
Layout {
size: size_of::<HeTonalPaletteClass>(),
alignment: align_of::<HeTonalPaletteClass>(),
},
),
(
"HeToneDeltaPair",
Layout {
size: size_of::<HeToneDeltaPair>(),
alignment: align_of::<HeToneDeltaPair>(),
},
),
(
"HeToneDeltaPairClass",
Layout {
size: size_of::<HeToneDeltaPairClass>(),
alignment: align_of::<HeToneDeltaPairClass>(),
},
),
(
"HeTonePolarity",
Layout {
size: size_of::<HeTonePolarity>(),
alignment: align_of::<HeTonePolarity>(),
},
),
(
"HeToneResolve",
Layout {
size: size_of::<HeToneResolve>(),
alignment: align_of::<HeToneResolve>(),
},
),
(
"HeVibrantScheme",
Layout {
size: size_of::<HeVibrantScheme>(),
alignment: align_of::<HeVibrantScheme>(),
},
),
(
"HeVibrantSchemeClass",
Layout {
size: size_of::<HeVibrantSchemeClass>(),
alignment: align_of::<HeVibrantSchemeClass>(),
},
),
(
"HeView",
Layout {
size: size_of::<HeView>(),
alignment: align_of::<HeView>(),
},
),
(
"HeViewAux",
Layout {
size: size_of::<HeViewAux>(),
alignment: align_of::<HeViewAux>(),
},
),
(
"HeViewAuxClass",
Layout {
size: size_of::<HeViewAuxClass>(),
alignment: align_of::<HeViewAuxClass>(),
},
),
(
"HeViewChooser",
Layout {
size: size_of::<HeViewChooser>(),
alignment: align_of::<HeViewChooser>(),
},
),
(
"HeViewChooserClass",
Layout {
size: size_of::<HeViewChooserClass>(),
alignment: align_of::<HeViewChooserClass>(),
},
),
(
"HeViewClass",
Layout {
size: size_of::<HeViewClass>(),
alignment: align_of::<HeViewClass>(),
},
),
(
"HeViewDual",
Layout {
size: size_of::<HeViewDual>(),
alignment: align_of::<HeViewDual>(),
},
),
(
"HeViewDualClass",
Layout {
size: size_of::<HeViewDualClass>(),
alignment: align_of::<HeViewDualClass>(),
},
),
(
"HeViewMono",
Layout {
size: size_of::<HeViewMono>(),
alignment: align_of::<HeViewMono>(),
},
),
(
"HeViewMonoClass",
Layout {
size: size_of::<HeViewMonoClass>(),
alignment: align_of::<HeViewMonoClass>(),
},
),
(
"HeViewSubTitle",
Layout {
size: size_of::<HeViewSubTitle>(),
alignment: align_of::<HeViewSubTitle>(),
},
),
(
"HeViewSubTitleClass",
Layout {
size: size_of::<HeViewSubTitleClass>(),
alignment: align_of::<HeViewSubTitleClass>(),
},
),
(
"HeViewSwitcher",
Layout {
size: size_of::<HeViewSwitcher>(),
alignment: align_of::<HeViewSwitcher>(),
},
),
(
"HeViewSwitcherClass",
Layout {
size: size_of::<HeViewSwitcherClass>(),
alignment: align_of::<HeViewSwitcherClass>(),
},
),
(
"HeViewTitle",
Layout {
size: size_of::<HeViewTitle>(),
alignment: align_of::<HeViewTitle>(),
},
),
(
"HeViewTitleClass",
Layout {
size: size_of::<HeViewTitleClass>(),
alignment: align_of::<HeViewTitleClass>(),
},
),
(
"HeViewingConditions",
Layout {
size: size_of::<HeViewingConditions>(),
alignment: align_of::<HeViewingConditions>(),
},
),
(
"HeViewingConditionsClass",
Layout {
size: size_of::<HeViewingConditionsClass>(),
alignment: align_of::<HeViewingConditionsClass>(),
},
),
(
"HeWelcomeScreen",
Layout {
size: size_of::<HeWelcomeScreen>(),
alignment: align_of::<HeWelcomeScreen>(),
},
),
(
"HeWelcomeScreenClass",
Layout {
size: size_of::<HeWelcomeScreenClass>(),
alignment: align_of::<HeWelcomeScreenClass>(),
},
),
(
"HeWindow",
Layout {
size: size_of::<HeWindow>(),
alignment: align_of::<HeWindow>(),
},
),
(
"HeWindowClass",
Layout {
size: size_of::<HeWindowClass>(),
alignment: align_of::<HeWindowClass>(),
},
),
(
"HeXYZColor",
Layout {
size: size_of::<HeXYZColor>(),
alignment: align_of::<HeXYZColor>(),
},
),
];
const RUST_CONSTANTS: &[(&str, &str)] = &[
("(gint) HE_ABOUT_WINDOW_LICENSES_APACHEV2", "4"),
("(gint) HE_ABOUT_WINDOW_LICENSES_GPLV3", "0"),
("(gint) HE_ABOUT_WINDOW_LICENSES_MIT", "1"),
("(gint) HE_ABOUT_WINDOW_LICENSES_MPLV2", "2"),
("(gint) HE_ABOUT_WINDOW_LICENSES_PROPRIETARY", "6"),
("(gint) HE_ABOUT_WINDOW_LICENSES_UNLICENSE", "3"),
("(gint) HE_ABOUT_WINDOW_LICENSES_WTFPL", "5"),
("(gint) HE_ANIMATION_STATE_FINISHED", "3"),
("(gint) HE_ANIMATION_STATE_IDLE", "0"),
("(gint) HE_ANIMATION_STATE_PAUSED", "1"),
("(gint) HE_ANIMATION_STATE_PLAYING", "2"),
("(gint) HE_AVATAR_STATUS_COLOR_GREEN", "1"),
("(gint) HE_AVATAR_STATUS_COLOR_RED", "0"),
("(gint) HE_AVATAR_STATUS_COLOR_YELLOW", "2"),
("(gint) HE_BANNER_STYLE_ERROR", "2"),
("(gint) HE_BANNER_STYLE_INFO", "0"),
("(gint) HE_BANNER_STYLE_WARNING", "1"),
("(gint) HE_BOTTOM_BAR_FLOATING_POSITION_BOTTOM", "0"),
("(gint) HE_BOTTOM_BAR_FLOATING_POSITION_LEFT", "1"),
("(gint) HE_BOTTOM_BAR_FLOATING_POSITION_RIGHT", "2"),
("(gint) HE_BOTTOM_BAR_MODE_DOCKED", "0"),
("(gint) HE_BOTTOM_BAR_MODE_FLOATING", "1"),
("(gint) HE_BOTTOM_BAR_POSITION_LEFT", "0"),
("(gint) HE_BOTTOM_BAR_POSITION_RIGHT", "1"),
("(gint) HE_BOTTOM_BAR_STYLE_DEFAULT", "0"),
("(gint) HE_BOTTOM_BAR_STYLE_VIBRANT", "1"),
("(gint) HE_BUTTON_COLOR_PRIMARY", "1"),
("(gint) HE_BUTTON_COLOR_SECONDARY", "2"),
("(gint) HE_BUTTON_COLOR_SURFACE", "0"),
("(gint) HE_BUTTON_COLOR_TERTIARY", "3"),
("(gint) HE_BUTTON_SIZE_LARGE", "3"),
("(gint) HE_BUTTON_SIZE_MEDIUM", "2"),
("(gint) HE_BUTTON_SIZE_SMALL", "1"),
("(gint) HE_BUTTON_SIZE_XLARGE", "4"),
("(gint) HE_BUTTON_SIZE_XSMALL", "0"),
("(gint) HE_BUTTON_WIDTH_DEFAULT", "0"),
("(gint) HE_BUTTON_WIDTH_NARROW", "1"),
("(gint) HE_BUTTON_WIDTH_WIDE", "2"),
("(gint) HE_CARD_LAYOUT_HORIZONTAL", "1"),
("(gint) HE_CARD_LAYOUT_VERTICAL", "0"),
("(gint) HE_CARD_TYPE_DEFAULT", "0"),
("(gint) HE_CARD_TYPE_ELEVATED", "3"),
("(gint) HE_CARD_TYPE_FILLED", "2"),
("(gint) HE_CARD_TYPE_OUTLINE", "1"),
("(gint) HE_CHIP_GROUP_MODE_FILTERING", "1"),
("(gint) HE_CHIP_GROUP_MODE_SELECTION", "0"),
("(gint) HE_COLORS_BLUE", "5"),
("(gint) HE_COLORS_BROWN", "10"),
("(gint) HE_COLORS_DARK", "12"),
("(gint) HE_COLORS_GREEN", "4"),
("(gint) HE_COLORS_INDIGO", "6"),
("(gint) HE_COLORS_LIGHT", "11"),
("(gint) HE_COLORS_MINT", "9"),
("(gint) HE_COLORS_NONE", "0"),
("(gint) HE_COLORS_ORANGE", "2"),
("(gint) HE_COLORS_PINK", "8"),
("(gint) HE_COLORS_PURPLE", "7"),
("(gint) HE_COLORS_RED", "1"),
("(gint) HE_COLORS_YELLOW", "3"),
(
"(gint) HE_CONTENT_BLOCK_IMAGE_CLUSTER_IMAGE_POSITION_BOTTOM_LEFT",
"1",
),
(
"(gint) HE_CONTENT_BLOCK_IMAGE_CLUSTER_IMAGE_POSITION_BOTTOM_RIGHT",
"3",
),
(
"(gint) HE_CONTENT_BLOCK_IMAGE_CLUSTER_IMAGE_POSITION_TOP_LEFT",
"0",
),
(
"(gint) HE_CONTENT_BLOCK_IMAGE_CLUSTER_IMAGE_POSITION_TOP_RIGHT",
"2",
),
("(gint) HE_DESKTOP_COLOR_SCHEME_DARK", "1"),
("(gint) HE_DESKTOP_COLOR_SCHEME_LIGHT", "2"),
("(gint) HE_DESKTOP_COLOR_SCHEME_NO_PREFERENCE", "0"),
("(gint) HE_DESKTOP_ENSOR_SCHEME_DEFAULT", "0"),
("(gint) HE_DESKTOP_ENSOR_SCHEME_MONOCHROMATIC", "3"),
("(gint) HE_DESKTOP_ENSOR_SCHEME_MUTED", "2"),
("(gint) HE_DESKTOP_ENSOR_SCHEME_SALAD", "4"),
("(gint) HE_DESKTOP_ENSOR_SCHEME_VIBRANT", "1"),
("(gint) HE_EASING_EASE_IN_OUT_BOUNCE", "2"),
("(gint) HE_EASING_EASE_OUT_CUBIC", "1"),
("(gint) HE_EASING_LINEAR", "0"),
("(gint) HE_GROUPED_BUTTON_SIZE_LARGE", "2"),
("(gint) HE_GROUPED_BUTTON_SIZE_MEDIUM", "1"),
("(gint) HE_GROUPED_BUTTON_SIZE_SMALL", "0"),
("(gint) HE_GROUPED_BUTTON_SIZE_XLARGE", "3"),
("(gint) HE_MODIFIER_BADGE_ALIGNMENT_CENTER", "1"),
("(gint) HE_MODIFIER_BADGE_ALIGNMENT_LEFT", "0"),
("(gint) HE_MODIFIER_BADGE_ALIGNMENT_RIGHT", "2"),
("(gint) HE_OVERLAY_BUTTON_ALIGNMENT_CENTER", "1"),
("(gint) HE_OVERLAY_BUTTON_ALIGNMENT_LEFT", "0"),
("(gint) HE_OVERLAY_BUTTON_ALIGNMENT_RIGHT", "2"),
("(gint) HE_OVERLAY_BUTTON_SIZE_LARGE", "2"),
("(gint) HE_OVERLAY_BUTTON_SIZE_MEDIUM", "1"),
("(gint) HE_OVERLAY_BUTTON_SIZE_SMALL", "0"),
("(gint) HE_OVERLAY_BUTTON_TYPE_BUTTON_PRIMARY", "1"),
("(gint) HE_OVERLAY_BUTTON_TYPE_BUTTON_SECONDARY", "2"),
("(gint) HE_OVERLAY_BUTTON_TYPE_BUTTON_SURFACE", "0"),
("(gint) HE_OVERLAY_BUTTON_TYPE_BUTTON_TERTIARY", "3"),
("(gint) HE_SCHEME_VARIANT_CONTENT", "5"),
("(gint) HE_SCHEME_VARIANT_DEFAULT", "0"),
("(gint) HE_SCHEME_VARIANT_MONOCHROME", "3"),
("(gint) HE_SCHEME_VARIANT_MUTED", "2"),
("(gint) HE_SCHEME_VARIANT_SALAD", "4"),
("(gint) HE_SCHEME_VARIANT_VIBRANT", "1"),
("(gint) HE_TAB_SWITCHER_TAB_BAR_BEHAVIOR_ALWAYS", "0"),
("(gint) HE_TAB_SWITCHER_TAB_BAR_BEHAVIOR_NEVER", "2"),
("(gint) HE_TAB_SWITCHER_TAB_BAR_BEHAVIOR_SINGLE", "1"),
("(gint) HE_TIP_VIEW_STYLE_NONE", "0"),
("(gint) HE_TIP_VIEW_STYLE_POPUP", "1"),
("(gint) HE_TIP_VIEW_STYLE_VIEW", "2"),
("(gint) HE_TONE_POLARITY_DARKER", "0"),
("(gint) HE_TONE_POLARITY_LIGHTER", "2"),
("(gint) HE_TONE_POLARITY_RELATIVE_DARKER", "1"),
("(gint) HE_TONE_POLARITY_RELATIVE_LIGHTER", "3"),
("(gint) HE_TONE_RESOLVE_EXACT", "0"),
("(gint) HE_TONE_RESOLVE_FARTHER", "2"),
("(gint) HE_TONE_RESOLVE_NEARER", "1"),
];