apiaryio / mson

Markdown Syntax for Object Notation
MIT License
900 stars 180 forks source link

how to specify multiple types for a property? #32

Closed it-ony closed 9 years ago

it-ony commented 9 years ago

When working with polymorph types, a property could have a set of possible types.

## BasketItemRule
+ discountOperation: (AbsoluteBasketItemDiscountOperation, RelativeBasketItemDiscountOperation)
+ selectors: (array[BasketItemSelector])

In this case the discountOperation can either have an AbsoluteBasketItemDiscountOperation or an RelativeBasketItemDiscountOperation.

For arrays I found somewhere in the documentation the following syntax

foobar: (array[A, B])

to accept elements of type A or type B

kylef commented 9 years ago

@it-ony You can use enumerations for this, for example:

- thing (enum)
    - 5 (number)
    - red (string)

Or

- things (array)
    - (enum)
        - red (string)
        - 5 (number)

https://github.com/apiaryio/mson/blob/master/MSON%20Specification.md#212-structure-types

it-ony commented 9 years ago

The discountOperation are real objects with an own structure, not just an enumeration. Right now the structure looks like this.

### BasketItemDiscountOperation

### AbsoluteBasketItemDiscountOperation (BasketItemDiscountOperation)
+ type: AbsoluteBasketItemDiscountOperation (string)
+ amount: 0 (number)

### RelativeBasketItemDiscountOperation (BasketItemDiscountOperation)
+ type: RelativeBasketItemDiscountOperation (string)
+ percentage: 0 (number)
pksunkara commented 9 years ago

@it-ony Yes, but enum is still used for it.

### AbsoluteBasketItemDiscountOperation (BasketItemDiscountOperation)
+ type: AbsoluteBasketItemDiscountOperation (string)
+ amount: 0 (number)

### RelativeBasketItemDiscountOperation (BasketItemDiscountOperation)
+ type: RelativeBasketItemDiscountOperation (string)
+ percentage: 0 (number)

### BasketItemDiscountOperation (enum)
+ (AbsoluteBasketItemDiscountOperation)
+ (RelativeBasketItemDiscountOperation)
it-ony commented 9 years ago

@pksunkara - thanks! But, now I'm getting a circular reference - which kind of makes sense.

## BasketItemRule
+ discountOperation: (BasketItemDiscountOperation)
+ selectors: (array[AppearanceSelector, ArticleSelector, BusinessUnitSelector, CheapestItemSelector, ConditionSelector, PartnerSelector, ProductTypeSelector, ShopSelector, SizeSelector])

### BasketItemDiscountOperation (enum)
+ (AbsoluteBasketItemDiscountOperation)
+ (RelativeBasketItemDiscountOperation)

### AbsoluteBasketItemDiscountOperation (BasketItemDiscountOperation)
+ type: AbsoluteBasketItemDiscountOperation (string)
+ amount: 0 (number)

### RelativeBasketItemDiscountOperation (BasketItemDiscountOperation)
+ type: RelativeBasketItemDiscountOperation (string)
+ percentage: 0 (number)
pksunkara commented 9 years ago

@it-ony Is this resolved?

it-ony commented 9 years ago

Yes, thanks.