package com.mongodb.mongosh.result import com.mongodb.DBRef import com.mongodb.client.result.UpdateResult import org.bson.Document import org.bson.types.* import java.util.* import java.util.regex.Pattern sealed class MongoShellResult { abstract val value: T open fun _asPrintable(): String = value.toLiteral() override fun equals(other: Any?): Boolean { if (this === other) return true if (javaClass != other?.javaClass) return false other as MongoShellResult<*> return value == other.value } override fun hashCode(): Int { return value?.hashCode() ?: 0 } } class DocumentResult(override val value: Document) : MongoShellResult() class ObjectIdResult(override val value: ObjectId) : MongoShellResult() class Decimal128Result(override val value: Decimal128) : MongoShellResult() class SymbolResult(override val value: Symbol) : MongoShellResult() class MaxKeyResult : MongoShellResult() { override val value = MaxKey() } class MinKeyResult : MongoShellResult() { override val value = MinKey() } class DBRefResult(override val value: DBRef) : MongoShellResult() class BSONTimestampResult(override val value: BSONTimestamp) : MongoShellResult() class CodeResult(override val value: Code) : MongoShellResult() class CodeWithScopeResult(override val value: CodeWithScope) : MongoShellResult() class BinaryResult(override val value: Binary) : MongoShellResult() class UUIDResult(override val value: UUID) : MongoShellResult() class DateResult(override val value: Date) : MongoShellResult() class BooleanResult(override val value: Boolean) : MongoShellResult() class DoubleResult(override val value: Double) : MongoShellResult() { override fun _asPrintable(): String { return value.toBigDecimal().toPlainString() } } class FloatResult(override val value: Float) : MongoShellResult() object FunctionResult : MongoShellResult() { override val value: String get() = "js function" } class IntResult(override val value: Int) : MongoShellResult() class LongResult(override val value: Long) : MongoShellResult() { override fun _asPrintable(): String { return value.toBigDecimal().toPlainString() } } object NullResult : MongoShellResult() { override val value: Any? get() = null } object VoidResult : MongoShellResult() { override val value: Any? = null } class StringResult(override val value: String) : MongoShellResult() { override fun _asPrintable(): String = value } class ArrayResult(override val value: List) : MongoShellResult>() class PatternResult(override val value: Pattern) : MongoShellResult() class MongoShellUpdateResult(override val value: UpdateResult) : MongoShellResult() class InsertOneResult(val acknowledged: Boolean, val insertedId: String) : MongoShellResult>() { override val value: Map get() = mapOf("acknowledged" to acknowledged, "insertedId" to insertedId) } class InsertManyResult(val acknowledged: Boolean, val insertedIds: List) : MongoShellResult>() { override val value: Map get() = mapOf("acknowledged" to acknowledged, "insertedIds" to insertedIds) } class DeleteResult(val acknowledged: Boolean, val deletedCount: Long) : MongoShellResult>() { override val value: Map get() = mapOf("acknowledged" to acknowledged, "deletedCount" to deletedCount) } class BulkWriteResult(val acknowledged: Boolean, val insertedCount: Long, val matchedCount: Long, val modifiedCount: Long, val deletedCount: Long, val upsertedCount: Long, val upsertedIds: List) : MongoShellResult>() { override val value: Map get() = mapOf("acknowledged" to acknowledged, "insertedCount" to insertedCount, "matchedCount" to matchedCount, "modifiedCount" to modifiedCount, "deletedCount" to deletedCount, "upsertedCount" to upsertedCount, "upsertedIds" to upsertedIds) } open class CursorResult>(override val value: T) : MongoShellResult() { override fun _asPrintable(): String = value._asPrintable() } class FindCursorResult internal constructor(cursor: FindCursor<*>) : CursorResult>(cursor)