packages/@aws-cdk/aws-s3tables-alpha/lib/util.ts (64 lines of code) (raw):

import { IConstruct } from 'constructs'; import { TableBucketAttributes } from './table-bucket'; import * as cdk from 'aws-cdk-lib/core'; export const S3_TABLES_SERVICE = 's3tables'; export function parseTableBucketArn(construct: IConstruct, props: TableBucketAttributes): string { // if we have an explicit table bucket ARN, use it. if (props.tableBucketArn) { return props.tableBucketArn; } if (props.tableBucketName) { return cdk.Stack.of(construct).formatArn({ region: props.region, account: props.account, service: S3_TABLES_SERVICE, resource: 'bucket', resourceName: props.tableBucketName, arnFormat: cdk.ArnFormat.SLASH_RESOURCE_NAME, }); } throw new cdk.ValidationError('Cannot determine bucket ARN. At least `tableBucketArn` is needed', construct); } export function parseTableBucketName(construct: IConstruct, props: TableBucketAttributes): string { // if we have an explicit bucket name, use it. if (props.tableBucketName) { return props.tableBucketName; } // extract table bucket name from bucket arn if (props.tableBucketArn) { const bucketNameFromArn = cdk.Stack.of(construct).splitArn(props.tableBucketArn, cdk.ArnFormat.SLASH_RESOURCE_NAME).resourceName; if (bucketNameFromArn) { return bucketNameFromArn; } } throw new cdk.ValidationError('tableBucketName is required and could not be inferred from context', construct); } export function parseTableBucketRegion(construct: IConstruct, props: TableBucketAttributes): string | undefined { // if we have an explicit bucket region, use it. if (props.region) { return props.region; } // extract table bucket region from bucket arn if (props.tableBucketArn) { const regionFromArn = cdk.Stack.of(construct).splitArn(props.tableBucketArn, cdk.ArnFormat.SLASH_RESOURCE_NAME).region; if (regionFromArn) { return regionFromArn; } } // Region is optional, can be inferred later return undefined; } export function parseTableBucketAccount(construct: IConstruct, props: TableBucketAttributes): string | undefined { // if we have an explicit bucket account, use it. if (props.account) { return props.account; } // extract table bucket account from bucket arn if (props.tableBucketArn) { const accountFromArn = cdk.Stack.of(construct).splitArn(props.tableBucketArn, cdk.ArnFormat.SLASH_RESOURCE_NAME).account; if (accountFromArn) { return accountFromArn; } } // Account is optional, can be inferred later return undefined; } /** * @returns populated attributes from given scope and attributes * @throws ValidationError if any of the required attribures are missing */ export function validateTableBucketAttributes(construct: IConstruct, props: TableBucketAttributes) { return { tableBucketName: parseTableBucketName(construct, props), account: parseTableBucketAccount(construct, props), region: parseTableBucketRegion(construct, props), tableBucketArn: parseTableBucketArn(construct, props), }; }