67 lines
1.8 KiB
Zig
67 lines
1.8 KiB
Zig
const std = @import("std");
|
|
const smithy = @import("smithy");
|
|
|
|
pub const Shape = @FieldType(smithy.ShapeInfo, "shape");
|
|
pub const ServiceShape = @TypeOf((Shape{ .service = undefined }).service);
|
|
pub const ListShape = @TypeOf((Shape{ .list = undefined }).list);
|
|
pub const MapShape = @TypeOf((Shape{ .map = undefined }).map);
|
|
|
|
pub fn getShapeInfo(id: []const u8, shapes: std.StringHashMap(smithy.ShapeInfo)) !smithy.ShapeInfo {
|
|
return shapes.get(id) orelse {
|
|
std.debug.print("Shape ID not found. This is most likely a bug. Shape ID: {s}\n", .{id});
|
|
return error.InvalidType;
|
|
};
|
|
}
|
|
|
|
pub fn getShapeTraits(shape: Shape) []smithy.Trait {
|
|
return switch (shape) {
|
|
.service, .operation, .resource => std.debug.panic("Unexpected shape type: {}", .{shape}),
|
|
inline else => |s| s.traits,
|
|
};
|
|
}
|
|
|
|
pub fn getShapeMembers(shape: Shape) []smithy.TypeMember {
|
|
return switch (shape) {
|
|
inline .structure, .uniontype => |s| s.members,
|
|
else => std.debug.panic("Unexpected shape type: {}", .{shape}),
|
|
};
|
|
}
|
|
|
|
pub fn shapeIsLeaf(shape: Shape) bool {
|
|
return switch (shape) {
|
|
.@"enum",
|
|
.bigDecimal,
|
|
.bigInteger,
|
|
.blob,
|
|
.boolean,
|
|
.byte,
|
|
.document,
|
|
.double,
|
|
.float,
|
|
.integer,
|
|
.long,
|
|
.short,
|
|
.string,
|
|
.timestamp,
|
|
=> true,
|
|
else => false,
|
|
};
|
|
}
|
|
|
|
pub fn shapeIsOptional(traits: []smithy.Trait) bool {
|
|
return !hasTrait(.required, traits);
|
|
}
|
|
|
|
pub fn findTrait(trait_type: smithy.TraitType, traits: []smithy.Trait) ?smithy.Trait {
|
|
for (traits) |trait| {
|
|
if (trait == trait_type) {
|
|
return trait;
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
pub fn hasTrait(trait_type: smithy.TraitType, traits: []smithy.Trait) bool {
|
|
return findTrait(trait_type, traits) != null;
|
|
}
|