First "full" DSL

- Search Type
 - Term
 - Vendor
 - Additional columns/sorting
This commit is contained in:
Oliver Rümpelein 2020-04-17 12:52:29 +02:00
parent cc703d5554
commit d6a1c0afa1
9 changed files with 408 additions and 78 deletions

View file

@ -15,17 +15,15 @@ fun hello(): String = "Hello from ${Platform.name}"
fun generateQueryUrl() = rcdbQuery { fun generateQueryUrl() = rcdbQuery {
searchFor(SearchType.COASTER) searchFor(SearchType.COASTER)
vendors( searchTerm("Dragon")
Vendor.INTAMIN, vendors {
Vendor.MACK vekoma()
) intamin()
sortBy( mack()
Order.MANUFACTURER, of(Vendor.PRESTON_AND_BARBIERI)
Order.INVERSIONS }
) sortBy {
custom( manufacturer()
"foo", inversion()
createRcdbParam(paramId = 12), }
createRcdbParam(paramId = 24)
)
} }

View file

@ -3,10 +3,48 @@ package de.pheerai.rcdbquery.dataMappings
enum class Order( enum class Order(
override val prettyName: String, override val prettyName: String,
override val fullName: String, override val fullName: String,
override val paramId: Int override val paramValue: Int
) : RcdbParamOption { ) : RcdbParamOption<Int> {
IMAGES("Images", "Amount of Images", 0),
NAME("Name", "Name of the Coaster", 1),
@Deprecated(
"The purpose of this parameter is yet unclear. You might want to use NAME instead",
level = DeprecationLevel.WARNING,
replaceWith = ReplaceWith("Order.NAME")
)
NAME_2("Name", "Name of the Coaster. Difference to NAME not clear", 2),
LOCATION("Location", 3),
PARK("Park", 4),
OPENED("Opened", "Opening Date", 8),
CLOSED("Closed", "Closing Date (past)", 9),
@Deprecated(
"This field seems to have been deprecated in favor of another parameter",
level = DeprecationLevel.WARNING,
replaceWith = ReplaceWith("Order.STATE")
)
STATE_2("State", "Operational State (legacy)", 10),
ENTERED("Entered", 12),
TYPE("Type", "Constrcution Type (Wood, Steel)", 13),
DESIGN("Design", "Train Design (Sit-Down, Invert,...)", 14),
CLASSIFICATION("Classification", "Coaster Classification (Coaster, Powered Coaster, Mountain Coaster)", 15),
LAYOUT("Layout", 16),
MODEL("Model", "Manufacturer Model", 17),
MODEL_LINE("Model-Line", "Coaster Model Line", 18),
SPEED("Speed", "Max. Speed", 19),
HEIGHT("Height", 20),
DROP("Drop", "Highest Drop", 21),
LENGTH("Length", 22),
ANGLE("Angle", 23),
INVERSIONS("Inversions", "Number of inversions", 24),
SERIAL_NO("Serial", "Serial number", 25),
SCALE("Scale", "Thrill factor", 26),
RIDE_TIME("Ride Time", 27),
STATE("State", "Operational state", 29),
MANUFACTURER("Manufacturer", 30), MANUFACTURER("Manufacturer", 30),
INVERSIONS("Inversion", "Number of inversions", 24); CLOSING("Closing", "(Future) closign date for temporary installations", 31)
;
constructor(name: String, paramId: Int) : this(name, name, paramId) constructor(name: String, paramId: Int) : this(name, name, paramId)

View file

@ -1,20 +1,7 @@
package de.pheerai.rcdbquery.dataMappings package de.pheerai.rcdbquery.dataMappings
interface RcdbParamOption { interface RcdbParamOption<out T> {
val prettyName: String val prettyName: String
val fullName: String val fullName: String
val paramId: Int val paramValue: T
}
fun createRcdbParam(
prettyName: String = "",
fullName:String = "",
paramId: Int = -1
) : RcdbParamOption = object : RcdbParamOption {
override val prettyName: String
get() = prettyName
override val fullName: String
get() = fullName
override val paramId: Int
get() = paramId
} }

View file

@ -1,8 +1,2 @@
package de.pheerai.rcdbquery.dataMappings package de.pheerai.rcdbquery.dataMappings
data class RcdbQueryParam<out T : RcdbParamOption>(val paramName: String, val paramOptions: List<T>)
data class RcdbQueryParamBuilder<T : RcdbParamOption>(var paramName: String, val paramOption: MutableList<T>) {
fun append(option: T) {
this.paramOption.add(option)
}
}

View file

@ -0,0 +1,9 @@
package de.pheerai.rcdbquery.dataMappings
class SearchTerm(override val paramValue: String): RcdbParamOption<String> {
override val prettyName = "Search Term"
override val fullName = "Search for elements whose name contain this term"
companion object {
const val staticParamName = "nc"
}
}

View file

@ -3,9 +3,12 @@ package de.pheerai.rcdbquery.dataMappings
enum class SearchType( enum class SearchType(
override val prettyName: String, override val prettyName: String,
override val fullName: String, override val fullName: String,
override val paramId: Int override val paramValue: Int
) : RcdbParamOption { ) : RcdbParamOption<Int> {
COASTER("Coaster", "Search for Roller Coaster", 2) COASTER("Coaster", "Search for Roller Coaster", 2),
AMUSEMENT_PARK("Amusement Parks", "Searh for an amusement park", 3),
COMPANY("Company", "Search for company (manufacturer, engineering,...)", 12),
PERSON("Person", "Search for a person (designer, engineer,...)", 13)
; ;
companion object { companion object {

View file

@ -3,8 +3,229 @@ package de.pheerai.rcdbquery.dataMappings
enum class Vendor( enum class Vendor(
override val prettyName: String, override val prettyName: String,
override val fullName: String, override val fullName: String,
override val paramId: Int override val paramValue: Int
) : RcdbParamOption { ) : RcdbParamOption<Int> {
YAQIAO_MACHINE("Yaqiao", "Yaqiao Machine", 6471),
CREDIBLE("Credible", 6584),
ARROW("Arrow", "Arrow Dynamics", 6835),
PHILADELPHIA_TOBOGGAN_COASTERS("Philadelphia Toboggan Coasters", "Philadelphia Toboggan Coasters, Inc.", 6841),
DINN("Dinn", "Dinn Corporation", 6842),
SCHWARZKOPF("Schwarzkopf", 6844),
INTERNATIONAL_AMUSEMENT_DEVICES("International Amusement Devices", "International Amusement Devices, Inc.", 6846),
MORGAN("Morgan", 6847),
PREMIER("Premier", "Premier Rides", 6848),
TOGO("Togo", 6849),
E_AND_F_MILER("E&F Miler", "E&F Miler Industries", 6858),
INTERNATIONAL_COASTERS("International Coasters", "International Coasters, Inc.", 6859),
PINFARI("Pinfari", 6862),
RAUERHORST("Rauerhorst", "Rauerhorst Corporation", 6864),
NATIONAL_AMUSEMENT_DEVICE_COMPANY("National Amusement Device Company", 6867),
CCI("CCI", "Custom Coasters International, Inc.", 6868),
OVERLAND_AMUSEMENTS("Overland Amusements", 6870),
MOLINA_AND_SONS("Molina & Son's", 6871),
ALLAN_HERSCHELL("Allan Herschell Company", 6872),
SDC("S.D.C.", 6873),
HENSEL_PHELPS("Hensel Phelps","Hensel Phelps Construction Co.", 6879),
HOPKINS("Hopkins", 6881),
CHANCE("Chance", "Chance Rides", 6887),
BRADLEY_AND_KAYE("Bradley and Kaye", 6894),
SARTORI("Sartori", "Sartori Rides", 6895),
MICHAEL_BLACK("Michael Black Assoc.","Michael Black and Associates", 6898),
REVERCHON("Reverchon", 6902),
TOP_FUN("Top Fun", 6903),
WISDOM("WISDOM", "Wisdom Rides", 6904),
L_AND_T("L&T", "L&T Systems", 6906),
COASTER_WORKS("Coaster Works", "Coaster Works, Inc.", 6907),
GIOVANOLA("Giovanola", 6908),
B_A_SCHIFF("B. A. Schiff Assoc.","B. A. Schiff & Associates", 6914),
RCCA("RCCA", "Roller Coaster Corporation of America", 6918),
CARIPRO("Caripro", 6919),
SETPOINT("Setpoint", 6920),
SANSEI_YUSOKI("Sansei Yusoki", "Sansei Yusoki Co., Ltd.", 6923),
S_AND_S_SANSEI("S&S Sansei", "S&S Sansei Technologies", 6930),
BIG_COUNTRY_MOTIONEERING("Big Country Motioneering", 6938),
SOQUET("Soquet", 6940),
CAVAZZA_DIEGO("Cavazza Diego", 6942),
SUPERCAR("Supercar", 6944),
S_AND_MC("S&MC", 6947),
FAB("FAB", 6949),
BHS("BHS", "Bayerische Berg-, Hütten- und Salzwerke AG", 6951),
FABBRI("Fabbri", 6953),
MEISHO("Meisho", "Meisho Amusement Machines", 6954),
SENYO_KOGYO("Senyo","Senyo Kogyo Co., Ltd.", 6957),
NIPPON("Nippon", 6958),
OKAMOTO("Okamoto", "Okamoto Co., Ltd.", 6970),
PAX("Pax", "Pax Company", 6971),
HOEI_SANGYO("Hoei Sangyo", "Hoei Sangyo Co., Ltd.", 6973),
THOMPSON("Thompson","L.A. Thompson Scenic Railway Company", 6975),
WGH_TRANSPORTATION("WGH Transportation", 6979),
HARTON("TM Harton", "TM Harton Company", 7000),
APPLE("Apple", 7030),
INTERPARK("Interpark", 7035),
DPV_RIDES("D.P.V. Rides", 7038),
TRES_EIXOS("Três Eixos", 7041),
PRESTON_AND_BARBIERI("Preston & Barbieri", 7042),
DAMBROZ("Dambroz", 7055),
INVERTED_TECHNOLOGIES("Inverted Technologies", 7058),
HINDUSTAN("Hindustan Amusement Machines", 7065),
FAJUME("Fajume", 7083),
MCKAY("McKay Construction", 7099),
MERIDIAN("Meridian", "Meridian Ltd.", 7111),
BARBISAN("Barbisan", 7119),
BEIJING_SHIBAOLAI("Beijing Shibaolai Amusement Equipment", 7125),
BARBIERI("Barbieri Rides", 7137),
SUNKID_HEEGE("Sunkid Heege", "Sunkid Heege GmbH", 7140),
US_AMUSEMENT_COMPANY("U.S. Amusement Company", 7143),
LYNN_WELCHER("Lynn Welcher Construction Co.", 7152),
MONDIAL("Mondial", 7154),
C_AND_S("C&S", 7164),
MILER("Miler", "Miler Manufacturing", 7170),
BAILEY_RIDES("Bailey Rides", "Bailey Rides, Inc.", 7198),
AMERICAN_CONSTRUCTION("American Construction Co.", 7209),
AERIAL_TRAMWAY_CONSTRUCTION("Aerial Tramway Construction Co.", 7213),
BELMONT_CONSTRUCTION("Belmont Construction Co.", 7215),
SPIRAL_WHEEL_OPERATING_CORPORATION("Spiral Wheel Operating Corporation", 7216),
SKYTRAK("Skytrak International", 7222),
SELECT_CONTRACTS("Select Contracts", 7230),
MASAGO("Masago Industrial", 7236),
WESTECH("Westech", 7241),
INTERLINK("Interlink", 7243),
CHICAGO_COASTER("Chicago Coaster Co", 7249),
LUCREZIA_DI_CARTOCETO("Lucrezia Di Cartoceto", 7260),
BLACKPOOL_LEISURE("Blackpool Leisure Amusement Consultancy", 7268),
CINCINNATI_AMUSEMENT("Cincinnati Amusement Co.", 7290),
IE_PARK("I.E. Park", 7296),
PRINCETON_MACHINE("Princeton Machine", 7322),
POONAN_AMUSEMENT_RIDES("Poonan Amusement Rides Industries", 7330),
BREINIG_CONSTRUCTION("Breinig Construction Company", 7334),
FEDERAL_ENGINEERING("Federal Engineering Co.", 7341),
R_AND_C_ENTERTAINMENT("R&C Entertainment", 7349),
SPILLMAN_ENGINEERING("Spillman Engineering", 7354),
TRAVER_ENGINEERING("Traver Engineering Company", 7360),
MUNDIAL("Mundial", "Mundial Park, s.r.l.", 7379),
CARLL_AND_RAMAGOSA("Carll & Ramagosa", 7382),
MARTIN_AND_VLEMINCKX("Martin & Vleminckx", 7390),
CAM_BABY_KART("CAM Baby Kart", 7400),
EOS("EOS", 7418),
ACA("ACA", 7446),
IKEDA("Ikeda","Ikeda Works", 7447),
BUTLIN("Butlin", 7452),
TAKAHASHI_KIKAI_SANGYO("Takahashi Kikai Sangyo", 7472),
DYNAMIC("Dynamic Attractions", 7489),
GOLDEN_HORSE("Golden Horse", 7492),
WIEGAND("Wiegand", "Josef Wiegand GmbH & Co. KG", 7514),
ASCOT("Ascot Design", 7530),
DAL_AMUSEMENT_RIDES("DAL Amusement Rides Company", 7536),
CHILDRESS_COASTER("Childress Coaster", 7550),
CORDES_HOLZBAU("Cordes Holzbau", 7563),
FRONTIER_CONSTRUCTION("Frontier Construction Company", 7566),
DEBRINQUEDO("DeBrinquedo", 7567),
ZHEJIANG_JUMA_AMUSEMENT_EQUIPMENT("Zhejiang Juma Amusement Equipment Co., Ltd.", 7573),
SAEKI("Saeki", 7582),
KUMBAK("KumbaK","""KumbaK "The Amusement Engineers"""", 7608),
PINTO_BROTHERS("Pinto Brothers", 7657),
CEDEAL("Cedeal Rides", 7688),
DOPPELMAYR("Doppelmayr", 7700),
TANIGUCHI_SEISAKUSHO("Taniguchi Seisakusho", 7711),
SAMECO("Sameco", 7718),
SUL_PARK("Sul Park", 7728),
SECOND_AVENUE_TRACTION("Second Avenue Traction Company", 7738),
GOSETTO("Gosetto", 7761),
LEVENT_LUNAPARK("Levent Lunapark", 7839),
VAFAEI("Vafaei Rides", 7953),
VOSTOK("Vostok", 7959),
PARKASH_AMUSEMENTS("Parkash Amusements", 7963),
HEBEI_ZHONGYE_METALLURGICAL_EQUIPMENT_MANUFACTURING("Hebei Zhongye Metallurgical Equipment Manufacturing Co., Ltd", 7980),
R_AND_R("R&R", 8006),
ABC("abc", "abc rides", 8026), // Not a test object
TECHNICAL_PARK("Technical Park", 8046),
ROBLES_BOUSO("Robles Bouso Atracciones", 8057),
SAFECO("Safeco", 8063),
OKOBOJI("Okoboji Coaster Company", 8066),
OUTDOOR_AMUSEMENT("Outdoor Amusement Enterprise", "Outdoor Amusement Enterprise, Inc.", 8069),
BARTLING("Bartling", 8617),
BEIJING_JIUHUA_AMUSEMENT_RIDES_MANUFACTURING("Beijing Jiuhua Amusement Rides Manufacturing Co., Ltd.", 8765),
QIN_LONG("Qin Long", 8769),
CHANG_LONG("Chang Long", 8770),
JINFENG("Jinfeng", 9061),
NANFANG_AMUSEMENT_RIDES("Nanfang Amusement Rides Co.", 9069),
GG("Gravity Group", "Gravitykraft Corporation", 9225),
JINXIN_CREDIT("Jinxin Credit", 9279),
GUANGDONG_ZHONGSHAN_KANGLE_ENTERTAINMENT("Guangdong Zhongshan Kangle Entertainment Co. Ltd", 9364),
CHENGDU_XINDU_XINAN_PLAYINGMENT("Chengdu Xindu Xin'an Playingment", 9374),
ANALOG("Analog", 9522),
SAU_CON("Sấu Con", 9606),
FUN_RIDES_TECH("Fun Rides Tech", 10162),
DOUBLE_GRIP_TUBULAR_STEEL_AMUSEMENT_DEVICES("Double Grip Tubular Steel Amusement Devices Ltd.", 10275),
NOVA_ATRACOES("Nova Atrações", 10288),
HOPKINS_AND_PEARCE("Hopkins & Pearce", 10575),
RAINBOW("Rainbow Rides", 10638),
JINGBEI_AMUSEMENT_EQUIPMENT("Jingbei Amusement Equipment Co., Ltd.", 10699),
RADAR_PLAY("Radar Play", 10854),
DIVERMAX_ENTRETENIMENTO("Divermax Entretenimento", 10865),
FUN_XIAN_MACHINERY_MANUFACTURING_RANGER("Fun Xian Machinery Manufacturing Ranger Company", 10888),
CHANGHONG_ENTERTAINMENT_MACHINERY("Changhong Entertainment Machinery Co., Ltd.", 10951),
BAODING_HENGRUI_YOULE_JUXIE("Baoding Hengrui Youle Juxie Co., Ltd", 10966),
ZHONGSHAN_PLAYGROUND_EQUIPMENT_ENGINEERING("Zhongshan Playground Equipment Engineering Co., Ltd.", 11014),
SHANGHAI_QINGPU("Shanghai Qingpu", 11015),
GARCIA_BRINQUEDOS("Garcia Brinquedos", 11258),
BOMBAY_AMUSEMENT_RIDE("Bombay Amusement Ride, Limited", 11358),
YUNHAI_YOUYI("Yunhai Youyi", 11971),
ART_ENGINEERING("ART", "ART Engineering GmbH", 12029),
ZHIPAO("Zhipao", 12208),
GUOHUI_MACHINERY("Guohui Machinery", 12215),
CEZARY_BOROWIAK("Cezary Borowiak", 12595),
BRANDAUER("Brandauer", 12645),
NEW_HORSE("New Horse", 12656),
GROS("Gros", 12908),
AQUATIC_DEVELOPMENT_GROUP("Aquatic Development Group", 12962),
WUHAN_FUTE_AMUSEMENT_RIDES("Wuhan Fute Amusement Rides", 13779),
PRETZEL_AMUSEMENT_RIDE("Pretzel Amusement Ride Company", 14023),
CETI("CETI", 14170),
SC_ITALY("S.C. Italy", 14376),
XIAN_BAOLIU_PLAYGROUND_EQUIPMENT("Xi'an Baoliu Playground Equipment Factory", 14386),
PETER_PETZ("Peter Petz", 14428),
BEIJING_NORTH_RONGDA_AMUSEMENT_EQUIPMENT("Beijing North Rongda Amusement Equipment Co.,Ltd", 14436),
MADHU_AMUSEMENTS_AND_LEISURE_CONCEPTS("Madhu Amusements & Leisure Concepts", 14688),
MASTER_PARK("Master Park", 14787),
TECHFUN("Techfun", 14793),
STEIN("Stein", 14802),
ERBSCHLOE_FUN("Erbschloe Fun Construct", 14848),
JAHN_CONSTRUCTION("Jahn Construction Co.", 14909),
ZHONGSHAN_JINBO_RECREATION_EQUIPMENT("Zhongshan Jinbo Recreation Equipment Co.", 14952),
GUVEN_LUNAPARK("Güven Lunapark", 14971),
MOUNTAIN_SYSTEMS("Mountain Systems GmbH", 14979),
STAHL_HACKSTEINER("Stahl-Hacksteiner-Metall GmbH", 15084),
ZHENGZHOU_LIMEIQI_AMUSEMENT_EQUIPMENT("Zhengzhou Limeiqi Amusement Equipment Co., Ltd", 15198),
A_BRINQUEDOS("A Brinquedos", 15358),
METAL_PARK("Metal Park", 15359),
BEIJING_CHEN_JINYING_AMUSEMENT_EQUIPMENT("Beijing Chen Jinying Amusement Equipment", 15597),
SKYLINE_ATTRACTIONS("Skyline Attractions", 15673),
SUN_SHIYOULE("Sun Shiyoule", 15728),
NITTO_FUN("Nitto Fun", 15918),
RIDE_ENGINEERS_SWITZERLAND("RES", "Ride Engineers Switzerland", 15977),
IRAN_PARK("Iran Park", 15986),
WILLIAMS_AMUSEMENT_DEVICE("Williams Amusement Device Company", 16153),
YAMASAKUTALAB("Yamasakutalab", 16385),
ZHENGZHOU_SHANGDIAN_MACHINERY_EQUIPMENT("Zhengzhou Shangdian Machinery Equipment Co., Ltd.", 16448),
HUATONG_TAIKE_AMUSEMENT_EQUIPMENT("Huatong Taike Amusement Equipment Co., Ltd.", 16455),
MECPOWER("Mecpower", 16555),
MODERN_AMUSEMENT("Modern Amusement Group", 16578),
EXTREME_ENGINEERING("Extreme Engineering", 16800),
MAXWELL_AND_SONS("Maxwell & Sons", 16877),
TECHNIKA_KULTURY("Technika Kultury LLC", 17015),
ZHONGSHAN_SUPERGAME_AMUSEMENT_MACHINE("Zhongshan Supergame Amusement Machine Co.,LTD", 17377),
ZHEJIANG_PENGMING_AMUSEMENT_EQUIPMENT("Zhejiang Pengming Amusement Equipment Co., Ltd.", 17388),
GOLDEN_KOALA_AMUSEMENT_EQUIPMENT("Golden Koala Amusement Equipment Co. Ltd.", 17477),
HEBEI_TIANHONG_AMUSEMENT_EQUIPMENT("Hebei Tianhong Amusement Equipment Company", 17513),
KING("King", 17528),
TAIZHOU_BAOLU_MACHINERY("Taizhou Baolu Machinery", 17900),
YEISK_PLANT_ATTRACTION("Yeisk Plant Attraction", 18040),
HEBEI_H_AND_S_AMUSEMENT_EQUIPMENT("Hebei H&S Amusement Equipment Co, LTD.", 18205),
GOLDEN_DRAGON_AMUSEMENT("Golden Dragon Amusement Group", 18224),
INTAMIN("Intamin", "Intamin Amusement Rides", 6837), INTAMIN("Intamin", "Intamin Amusement Rides", 6837),
VEKOMA("Vekoma", 6836), VEKOMA("Vekoma", 6836),
MACK("Mack Rides", "Mack Rides GmbH & Co KG", 6856), MACK("Mack Rides", "Mack Rides GmbH & Co KG", 6856),

View file

@ -2,18 +2,19 @@ package de.pheerai.rcdbquery.dsl
import de.pheerai.rcdbquery.dataMappings.* import de.pheerai.rcdbquery.dataMappings.*
inline class RcdbQueryParams(val params: Map<String, List<Int>>) inline class RcdbQueryParams(val params: Map<String, List<String>>)
class RcdbQueryParamsBuilder { class RcdbQueryParamsBuilder {
// TODO: Somewhat wrap away, then use param of one option. // TODO: Make way for single-valued params as well
private val params: MutableMap<String, List<RcdbParamOption>> = mutableMapOf() private val params: MutableMap<String, List<RcdbParamOption<Any>>> = mutableMapOf()
// TODO: Validate that search type is set
fun build() = RcdbQueryParams( fun build() = RcdbQueryParams(
params params
.filter { it.value.isNotEmpty() } .filter { it.value.isNotEmpty() }
.mapValues { e -> e.value.map { o -> o.paramId } } .mapValues { e -> e.value.map { o -> o.paramValue.toString() } }
) )
operator fun set(paramName: String, options: List<RcdbParamOption>) { operator fun set(paramName: String, options: List<RcdbParamOption<Any>>) {
when (paramName) { when (paramName) {
"order" -> if (this.params.containsKey(paramName)) { "order" -> if (this.params.containsKey(paramName)) {
this.params[paramName] = this.params[paramName].append(options) this.params[paramName] = this.params[paramName].append(options)
@ -24,7 +25,12 @@ class RcdbQueryParamsBuilder {
} }
} }
private fun List<RcdbParamOption>?.append(options: List<RcdbParamOption>) = this?.toMutableList()?.also { it.addAll(options) } ?: options operator fun get(paramName: String) = this.params[paramName]
private fun List<RcdbParamOption<Any>>?.append(options: List<RcdbParamOption<Any>>) =
this?.toMutableList()?.also { it.addAll(options) } ?: options
fun keys() = this.params.keys.toSet()
} }
fun rcdbQuery(body: RcdbQueryParamsBuilder.() -> RcdbQueryParamsBuilder) = fun rcdbQuery(body: RcdbQueryParamsBuilder.() -> RcdbQueryParamsBuilder) =
@ -34,7 +40,7 @@ data class RcdbUrlQuery(val baseUrl: String, val params: RcdbQueryParams) {
override fun toString(): String { override fun toString(): String {
return params.params return params.params
.asSequence() .asSequence()
.map{ e -> e.key to e.value.joinToString(separator = ",") } .map { e -> e.key to e.value.joinToString(separator = ",") }
.map { p -> "${p.first}=${p.second}" } .map { p -> "${p.first}=${p.second}" }
.joinToString(prefix = baseUrl, separator = "&") .joinToString(prefix = baseUrl, separator = "&")
} }
@ -46,29 +52,103 @@ fun rcdbQueryParams(body: RcdbQueryParamsBuilder.() -> RcdbQueryParamsBuilder):
return builder.build() return builder.build()
} }
/* TODO: Even better typing (usage of // TODO: Find way to only have one generic parameter
* ``` sealed class RcdbParamOptionBuilder<out U : Any, T : RcdbParamOption<U>> {
* vendors { private val paramList: MutableList<T> = mutableListOf()
* vekoma()
* intamin()
* of(Vendors.PRESTON_AND_BARBIERI)
* }
* ```
* instead.
* Maybe use inline class for MutableList / List?
*/
fun RcdbQueryParamsBuilder.vendors(vendors: List<Vendor>) = apply { this[Vendor.staticParamName] = vendors }
fun RcdbQueryParamsBuilder.vendors(vararg vendors: Vendor) = this.vendors(vendors.asList()) open fun add(param: T): RcdbParamOptionBuilder<U, T> {
paramList.add(param)
return this
}
fun RcdbQueryParamsBuilder.sortBy(orders: List<Order>) = apply { fun build() = paramList.toList()
this[Order.staticParamName] =orders
} }
fun RcdbQueryParamsBuilder.sortBy(vararg orders: Order) = this.sortBy(orders.asList()) //region Vendors
class VendorBuilder : RcdbParamOptionBuilder<Int, Vendor>() {
override fun add(param: Vendor): VendorBuilder {
super.add(param)
return this
}
}
fun RcdbQueryParamsBuilder.searchFor(searchType: SearchType) = fun RcdbQueryParamsBuilder.vendors(body: VendorBuilder.() -> VendorBuilder): RcdbQueryParamsBuilder {
apply { this[SearchType.staticParamName] = listOf(searchType) } val builder = VendorBuilder()
builder.body()
this[Vendor.staticParamName] = builder.build()
return this
}
fun RcdbQueryParamsBuilder.custom(paramName: String, values: List<RcdbParamOption>) = apply { this[paramName] = values } fun VendorBuilder.of(vendor: Vendor) = this.add(vendor)
fun RcdbQueryParamsBuilder.custom(paramName: String, vararg values: RcdbParamOption) = apply { this[paramName] = values.asList() } fun VendorBuilder.vekoma() = this.add(Vendor.VEKOMA)
fun VendorBuilder.intamin() = this.add(Vendor.INTAMIN)
fun VendorBuilder.mack() = this.add(Vendor.MACK)
fun VendorBuilder.bandm() = this.add(Vendor.B_AND_M)
fun VendorBuilder.gerstlauer() = this.add(Vendor.GERSTLAUER)
//endregion
//region Order
class OrderBuilder : RcdbParamOptionBuilder<Int, Order>() {
override fun add(param: Order): OrderBuilder {
super.add(param)
return this
}
}
fun RcdbQueryParamsBuilder.sortBy(body: OrderBuilder.() -> OrderBuilder): RcdbQueryParamsBuilder {
val builder = OrderBuilder()
builder.body()
this[Order.staticParamName] = builder.build()
return this
}
fun OrderBuilder.of(order: Order) = this.add(order)
fun OrderBuilder.manufacturer() = this.add(Order.MANUFACTURER)
fun OrderBuilder.inversion() = this.add(Order.INVERSIONS)
//endregion
//region Search type
fun RcdbQueryParamsBuilder.searchFor(searchType: SearchType) {
if (SearchType.staticParamName !in this.keys()) {
this[SearchType.staticParamName] = listOf(searchType)
} else {
error(
"""Only one search type must ever be set
| Old type: ${this[SearchType.staticParamName]!![0].prettyName}
| New type: ${searchType.prettyName}""".trimMargin()
)
}
}
//endregion
//region Search Term
fun RcdbQueryParamsBuilder.searchTerm(term: String) {
if (SearchTerm.staticParamName !in this.keys()) {
this[SearchTerm.staticParamName] = listOf(SearchTerm(term))
} else {
error(
"""Only one search term must ever be set
| Old term: ${this[SearchTerm.staticParamName]!![0].paramValue}
| New term: $term""".trimMargin()
)
}
}
//endregion
//region Unknown fields
@Suppress("unused")
@Deprecated(
"The parameter for extra columns has not yet been discovered (if it even exists). Use multiple values in the `sortBy` param instead (first values take sorting precedence)",
ReplaceWith("sortBy"), DeprecationLevel.ERROR
)
fun RcdbQueryParamsBuilder.extraColumns(orders: List<Order>): Nothing =
error("The parameter for extra columns has not yet been discovered (if it even exists). Use multiple values in the `sortBy` param instead (first values take sorting precedence)")
@Suppress("unused")
@Deprecated(
"The parameter for extra columns has not yet been discovered (if it even exists). Use multiple values in the `sortBy` param instead (first values take sorting precedence)",
ReplaceWith("sortBy"), DeprecationLevel.ERROR
)
fun RcdbQueryParamsBuilder.extraColumns(vararg orders: Order): Nothing =
error("The parameter for extra columns has not yet been discovered (if it even exists). Use multiple values in the `sortBy` param instead (first values take sorting precedence)")
//endregion

View file

@ -11,15 +11,15 @@ class RcdbQueryDslTest {
assertEquals( assertEquals(
"https://www.rcdb.com/r.htm?mk=6836,6856,6905&order=24,30", "https://www.rcdb.com/r.htm?mk=6836,6856,6905&order=24,30",
rcdbQuery { rcdbQuery {
vendors( vendors {
Vendor.VEKOMA, vekoma()
Vendor.MACK, mack()
Vendor.MAURER of(Vendor.MAURER)
) }
sortBy( sortBy {
Order.INVERSIONS, inversion()
Order.MANUFACTURER manufacturer()
) }
} }
) )
} }