///|
fn[T] patch_value(value : T?) -> @model.Undefinable[T] {
  match value {
    None => Missing
    Some(value) => Value(value)
  }
}

///|
fn[T] patch_nullable(
  field : String,
  value : T?,
  clear : Bool,
) -> @model.Undefinable[T] raise DiscordHttpError {
  if value is Some(_) && clear {
    raise Validation(message="\{field} and clear_\{field} cannot both be set")
  }
  if clear {
    Null
  } else {
    patch_value(value)
  }
}

///|
fn message_patch_builder(
  content : String?,
  clear_content : Bool,
  embeds : Array[@model.Embed]?,
  components : Array[@model.Component]?,
  flags : @model.MessageFlags?,
) -> @model.ObjBuilder raise DiscordHttpError {
  validate_content(content)
  let flags = message_flags_with_components_v2(
    flags, content, embeds, components,
  )
  @model.ObjBuilder()
  .und("content", patch_nullable("content", content, clear_content))
  .und("embeds", patch_value(embeds))
  .und("components", patch_value(components))
  .und("flags", patch_value(flags))
}