@k8ts/instruments
Version:
A collection of utilities and core components for k8ts.
88 lines (79 loc) • 2.32 kB
text/typescript
import { displayers } from "../displayers"
export type JoinIfNotEmpty<A extends string, J extends string, B extends string> = A extends ""
? B
: B extends ""
? A
: `${A}${J}${B}`
({
simple: s => s._url
})
export class ImageHost<Text extends string = string> {
private readonly _url: Text
constructor(source: Text) {
this._url = source
}
author<Author extends string>(name: Author) {
return new ImageAuthor<JoinIfNotEmpty<Text, "/", Author>>(this.toString(), name)
}
image<Image extends string>(name: Image) {
return new BaseImage<JoinIfNotEmpty<Text, "/", Image>>(this.toString(), name)
}
get [Symbol.toStringTag]() {
return this._url
}
}
({
simple: s => s._url
})
export class ImageAuthor<Text extends string = string> {
private readonly _url: Text
constructor(base: string, name: string) {
this._url = base === "" ? (name as Text) : ([base, name].join("/") as Text)
}
image<Image extends string>(name: Image) {
return new BaseImage<JoinIfNotEmpty<Text, "/", Image>>(this.toString(), name)
}
}
({
simple: s => {
if (!s._base) {
return s._name
}
return [s._base, s._name].join("/")
}
})
export class BaseImage<Text extends string = string> {
constructor(
private readonly _base: string,
private readonly _name: string
) {}
tag<Tag extends string>(tag: Tag) {
return new TaggedImage<JoinIfNotEmpty<Text, ":", Tag>>(this, tag)
}
}
({
simple: s => {
const fam = s._family.toString()
if (s._tag === "") {
return fam
}
return [fam, s._tag].join(":")
}
})
export class TaggedImage<Text extends string = string> {
constructor(
private readonly _family: BaseImage<string>,
private readonly _tag: string
) {}
}
export namespace Image {
export function author<Author extends string>(name: Author) {
return new ImageHost("").author(name)
}
export function name<Name extends `${string}/${string}`>(name: Name) {
return new ImageHost("").image(name)
}
export function host<Host extends string>(url: Host) {
return new ImageHost(url)
}
}