SunDog's API is divided into three pillars:
Lifted AWS SDK,
This collection is the raw SDK methods lifted from the original object. This frees them from the callback structure and wraps them in promises that we can
await on. This will always have the most detailed API because we can lift them programmatically with just a little code.
This collection is filled with relatively simple convenience methods that wrap a given AWS method. For example,
S3.putObject is wrapped by
put(bucketName, key, content, options). This is curried, easier to compose, and easier to work with than its object-oriented ancestor. This collection will slowly build as we have more need to write more wrappers.
This is an class-based collection built on top of the AWS Primitives collection. There is a tension between functional and object-oriented styles. Functional forms are easier to compose, but it can be useful to map class structures to entities. SunDog uses both to achieve expressive power in this pillar. For example,
Bucket is an instantiated collection of S3 "Primitives" curried on the bucket name. This organization also lets us compose novel functionality, like
Bucket::selfDestruct(). This deletes a bucket and takes care of emptying for you, first. We can compose the functionality not provided directly by AWS and make it available in a portable form.