A DynamoArray is a pure representation of an array of AttributeValues
Type class for defining serialisation to and from
DynamoDB's AttributeValue
Type class for defining serialisation to and from
DynamoDB's AttributeValue
>>> val listOptionFormat = DynamoFormat[List[Option[Int]]] >>> listOptionFormat.read(listOptionFormat.write(List(Some(1), None, Some(3)))) Right(List(Some(1), None, Some(3))) Also supports automatic and semi-automatic derivation for case classes
>>> import org.scanamo.generic.auto._ >>> >>> case class Farm(animals: List[String]) >>> case class Farmer(name: String, age: Long, farm: Farm) >>> val farmerF = DynamoFormat[Farmer] >>> farmerF.read(farmerF.write(Farmer("McDonald", 156L, Farm(List("sheep", "cow"))))) Right(Farmer(McDonald,156,Farm(List(sheep, cow))))
and for sealed trait + case object hierarchies
>>> sealed trait Animal >>> case object Aardvark extends Animal >>> case object Zebra extends Animal >>> case class Pet(name: String, animal: Animal) >>> val pet1 = Pet("Amy", Aardvark) >>> val pet2 = Pet("Zebediah", Zebra) >>> val petF = DynamoFormat[Pet] >>> petF.read(petF.write(pet1)) Right(Pet(Amy,Aardvark)) >>> petF.read(petF.write(pet2)) Right(Pet(Zebediah,Zebra))
Problems reading a value are detailed
>>> import cats.syntax.either._ >>> case class Developer(name: String, age: String, problems: Int) >>> val invalid = DynamoFormat[Farmer].read(DynamoFormat[Developer].write(Developer("Alice", "none of your business", 99))) >>> invalid Left(InvalidPropertiesError(NonEmptyList((age,NoPropertyOfType(N,DynString(none of your business))), (farm,MissingProperty)))) >>> invalid.leftMap(cats.Show[DynamoReadError].show) Left('age': not of type: 'N' was 'DynString(none of your business)', 'farm': missing)
Custom formats can often be most easily defined using DynamoFormat.coercedXmap, DynamoFormat.xmap or DynamoFormat.iso
A DynamoObject is a map of strings to values that can be embedded into
an AttributeValue.
A DynamoValue is a pure representation of an AttributeValue from the AWS SDK.
Provides a simplified interface for reading and writing case classes to DynamoDB
Provides a simplified interface for reading and writing case classes to DynamoDB
To avoid blocking, use org.scanamo.ScanamoAsync
Provides the same interface as org.scanamo.Scanamo, except that it requires an implicit concurrent.ExecutionContext and returns a concurrent.Future
Provides the same interface as org.scanamo.Scanamo, except that it requires an implicit concurrent.ExecutionContext and returns a concurrent.Future
Note that that com.amazonaws.services.dynamodbv2.AmazonDynamoDBAsyncClient just uses an java.util.concurrent.ExecutorService to make calls asynchronously
Represents a secondary index on a DynamoDB table.
Represents a DynamoDB table that operations can be performed against
Represents a DynamoDB table that operations can be performed against
>>> case class Transport(mode: String, line: String) >>> val client = LocalDynamoDB.client() >>> val scanamo = Scanamo(client) >>> import com.amazonaws.services.dynamodbv2.model.ScalarAttributeType._ >>> LocalDynamoDB.withRandomTable(client)("mode" -> S, "line" -> S) { t => ... import org.scanamo.syntax._ ... import org.scanamo.generic.auto._ ... val transport = Table[Transport](t) ... val operations = for { ... _ <- transport.putAll(Set( ... Transport("Underground", "Circle"), ... Transport("Underground", "Metropolitan"), ... Transport("Underground", "Central"))) ... results <- transport.query("mode" -> "Underground" and ("line" beginsWith "C")) ... } yield results.toList ... scanamo.exec(operations) ... } List(Right(Transport(Underground,Central)), Right(Transport(Underground,Circle)))