com.hp.jipp.encoding.AttributeGroup.kt Maven / Gradle / Ivy
// Copyright 2017 - 2021 HP Development Company, L.P.
// SPDX-License-Identifier: MIT
package com.hp.jipp.encoding
import com.hp.jipp.util.PrettyPrintable
import com.hp.jipp.util.PrettyPrinter
import java.io.IOException
/**
* A tagged list of attributes. Only one attribute of a given type may appear in the group, although each attribute
* may contain 0 or more values.
*/
interface AttributeGroup : PrettyPrintable, List> {
val tag: DelimiterTag
/** Return the attribute corresponding to the specified [name]. */
operator fun get(name: String): Attribute<*>?
/** Return the attribute as conforming to the supplied attribute type. */
operator fun get(type: AttributeType): Attribute?
/** Return all values found having this attribute type. */
fun getValues(type: AttributeType): List =
get(type) ?: listOf()
/** Return the first value of an attribute matching [type]. */
fun getValue(type: AttributeType): T? =
get(type)?.firstOrNull()
/** Return the string form of any values present for this attribute [type]. */
fun getStrings(type: AttributeType): List =
get(type)?.strings() ?: listOf()
/** Return the string form (or null) of the first value present for this attribute [type]. */
fun getString(type: AttributeType): String? =
get(type)?.strings()?.firstOrNull()
override fun print(printer: PrettyPrinter) {
printer.open(PrettyPrinter.OBJECT, tag.toString())
printer.addAll(this)
printer.close()
}
/** Return a new [AttributeGroup] with additional attributes added to the end. */
operator fun plus(attributes: List>): AttributeGroup =
AttributeGroupImpl(
tag,
(
map { it.type to it }.toMap() + attributes.map { it.type to it }
.toMap()
).values.toList()
)
/** Return a copy of this attribute group in mutable form. */
fun toMutable(): MutableAttributeGroup =
mutableGroupOf(tag, this)
/** Return a pretty-printed version of this packet (including separators and line breaks) */
fun prettyPrint(maxWidth: Int, indent: String) = PrettyPrinter(tag.name, PrettyPrinter.OBJECT, indent, maxWidth)
.addAll(this)
.print()
@Suppress("TooManyFunctions")
companion object {
/** Return a fixed group of attributes. */
@JvmStatic
fun groupOf(tag: DelimiterTag, attributes: Iterable>): AttributeGroup =
AttributeGroupImpl(tag, attributes.toList())
/** Return a fixed group of attributes. */
@JvmStatic
fun groupOf(tag: DelimiterTag, vararg attributes: Attribute<*>): AttributeGroup =
groupOf(tag, attributes.toList())
/** Return a mutable group of attributes. */
@JvmStatic
fun mutableGroupOf(tag: DelimiterTag, attributes: Iterable>): MutableAttributeGroup =
MutableAttributeGroup(tag, attributes.toList())
/** Return a mutable group of attributes. */
@JvmStatic
fun mutableGroupOf(tag: DelimiterTag, vararg attributes: Attribute<*>): MutableAttributeGroup =
mutableGroupOf(tag, attributes.toList())
/**
* Read an entire attribute group if available in the input stream.
*/
@JvmStatic
@Throws(IOException::class)
@Deprecated(
"Use IppInputStream.read()",
ReplaceWith("readAttributeGroup()", "com.hp.jipp.encoding.IppInputStream")
)
fun read(input: IppInputStream, groupTag: DelimiterTag) =
input.readAttributeGroup(groupTag)
}
}