module libwasm.bindings.CSSPseudoElement;

import libwasm.types;

import memutils.ct: tuple;
import libwasm.bindings.Animatable;
import libwasm.bindings.Animation;
import libwasm.bindings.Element;
import libwasm.bindings.KeyframeAnimationOptions;

@safe:
nothrow:

struct CSSPseudoElement {
  nothrow:
  JsHandle handle;
  alias handle this;
  this(Handle h) {
    this.handle = JsHandle(h);
  }
  string type()() {
    return Object_Getter__string(this.handle, "type");
  }
  auto element()() {
    return Element(Object_Getter__Handle(this.handle, "element"));
  }
  auto animate(T0)(scope auto ref Optional!(T0) keyframes, scope ref SumType!(double, KeyframeAnimationOptions) options) if (isTOrPointer!(T0, JsObject)) {
    return Animation(Serialize_Object_VarArgCall!Handle(this.handle, "animate", "Optional!Handle;SumType!(double,Handle)", tuple(!keyframes.empty, cast(Handle)keyframes.front.handle, libwasm.sumtype.match!(((double v) => 0),((ref options.Types[1] v) => 1))(options),tuple(libwasm.sumtype.match!(((double v) => v),((ref options.Types[1] v) => double.init))(options),libwasm.sumtype.match!(((double v) => Handle.init),((ref options.Types[1] v) => cast(Handle)v.handle))(options)))));
  }
  auto animate(T0)(scope auto ref Optional!(T0) keyframes) if (isTOrPointer!(T0, JsObject)) {
    return Animation(Serialize_Object_VarArgCall!Handle(this.handle, "animate", "Optional!Handle", tuple(!keyframes.empty, cast(Handle)keyframes.front.handle)));
  }
  auto getAnimations()(scope ref AnimationFilter filter) {
    return Sequence!(Animation)(Object_Call_Handle__Handle(this.handle, "getAnimations", filter.handle));
  }
  auto getAnimations()() {
    return Sequence!(Animation)(Object_Getter__Handle(this.handle, "getAnimations"));
  }
}