@seamapi/blueprint
Version:
Build tools for the Seam API using this blueprint.
65 lines (51 loc) • 1.84 kB
text/typescript
import { snakeCase } from 'change-case'
import type { Json, NonNullJson } from 'lib/json.js'
import type { CodeSampleContext, CodeSampleDefinition } from './code-sample.js'
export const createRubyRequest = (
{ request }: CodeSampleDefinition,
_context: CodeSampleContext,
): string => {
const parts = request.path.split('/')
const params = Object.entries(request.parameters)
.map(([key, value]) => `${snakeCase(key)}: ${formatRubyValue(value)}`)
.join(', ')
return `seam${parts.map((p) => snakeCase(p)).join('.')}(${params})`
}
const formatRubyValue = (value: Json): string =>
value == null ? 'nil' : JSON.stringify(value)
export const createRubyResponse = (
{ response, title }: CodeSampleDefinition,
context: CodeSampleContext,
): string => {
const { endpoint } = context
if (endpoint.response.responseType === 'void') return 'nil'
const { responseKey } = endpoint.response
const responseValue = response?.body?.[responseKey]
if (responseValue == null) {
throw new Error(`Missing ${responseKey} for '${title}'`)
}
return Array.isArray(responseValue)
? formatRubyArrayResponse(responseValue, title)
: formatRubyResponse(responseValue)
}
const formatRubyArrayResponse = (
responseArray: Json[],
title: string,
): string => {
const formattedItems = responseArray
.map((item) => {
if (item == null) {
throw new Error(`Null value in response array for '${title}'`)
}
return formatRubyResponse(item)
})
.join(',\n')
return `[${formattedItems}]`
}
const formatRubyResponse = (responseParams: NonNullJson): string => {
const values = Object.entries(responseParams as Record<string, Json>).map(
([paramKey, paramValue]) =>
`"${snakeCase(paramKey)}" => ${formatRubyValue(paramValue)}`,
)
return `{${values.join(',')}}`
}