///|
/// Flex direction.
pub(all) enum FlexDirection {
  Row
  RowReverse
  Column
  ColumnReverse
} derive(Eq, Debug)

///|
pub impl Show for FlexDirection with fn output(self, logger) {
  match self {
    Row => logger.write_string("Row")
    RowReverse => logger.write_string("RowReverse")
    Column => logger.write_string("Column")
    ColumnReverse => logger.write_string("ColumnReverse")
  }
}

///|
/// Alignment for justify-content, align-items and similar properties.
pub(all) enum Alignment {
  Start
  End
  FlexStart
  FlexEnd
  Center
  SpaceBetween
  SpaceAround
  SpaceEvenly
  Stretch
  Baseline
} derive(Eq, Debug)

///|
pub impl Show for Alignment with fn output(self, logger) {
  match self {
    Start => logger.write_string("Start")
    End => logger.write_string("End")
    FlexStart => logger.write_string("FlexStart")
    FlexEnd => logger.write_string("FlexEnd")
    Center => logger.write_string("Center")
    SpaceBetween => logger.write_string("SpaceBetween")
    SpaceAround => logger.write_string("SpaceAround")
    SpaceEvenly => logger.write_string("SpaceEvenly")
    Stretch => logger.write_string("Stretch")
    Baseline => logger.write_string("Baseline")
  }
}

///|
/// Align-self value.
pub(all) enum AlignSelf {
  Auto
  Start
  End
  Center
  Stretch
  Baseline
} derive(Eq, Debug)

///|
pub impl Show for AlignSelf with fn output(self, logger) {
  match self {
    Auto => logger.write_string("Auto")
    Start => logger.write_string("Start")
    End => logger.write_string("End")
    Center => logger.write_string("Center")
    Stretch => logger.write_string("Stretch")
    Baseline => logger.write_string("Baseline")
  }
}

///|
/// Generic 4-edge rect.
pub(all) struct Rect[T] {
  left : T
  right : T
  top : T
  bottom : T
}

///|
pub fn[T] Rect::new(left : T, right : T, top : T, bottom : T) -> Rect[T] {
  { left, right, top, bottom }
}

///|
/// CSS dimension value.
pub(all) enum Dimension {
  Length(Double)
  Percent(Double)
  Auto
  MinContent
  MaxContent
  FitContent(Double)
} derive(Eq, Debug)

///|
pub impl Show for Dimension with fn output(self, logger) {
  match self {
    Length(v) => {
      logger.write_string("Length(")
      Show::output(v, logger)
      logger.write_string(")")
    }
    Percent(v) => {
      logger.write_string("Percent(")
      Show::output(v, logger)
      logger.write_string(")")
    }
    Auto => logger.write_string("Auto")
    MinContent => logger.write_string("MinContent")
    MaxContent => logger.write_string("MaxContent")
    FitContent(v) => {
      logger.write_string("FitContent(")
      Show::output(v, logger)
      logger.write_string(")")
    }
  }
}