Skip to content

Commit

Permalink
Add { rest: } field to padding object notation
Browse files Browse the repository at this point in the history
  • Loading branch information
Basssiiie committed Jan 6, 2024
1 parent 29033c3 commit af24ab3
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 6 deletions.
2 changes: 1 addition & 1 deletion src/positional/padding.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,4 @@ export type Padding = Scale
| [Scale, Scale]
/* top | right | bottom | left */
| [Scale, Scale, Scale, Scale]
| { top?: Scale; right?: Scale; bottom?: Scale; left?: Scale };
| { top?: Scale; right?: Scale; bottom?: Scale; left?: Scale; rest?: Scale };
27 changes: 22 additions & 5 deletions src/positional/parsing/parsePadding.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { zeroPadding } from "@src/elements/constants";
import { endKeys, startKeys } from "@src/elements/layouts/paddingHelpers";
import * as Log from "@src/utilities/logger";
import { isArray, isObject, isUndefined } from "@src/utilities/type";
import { Padding } from "../padding";
Expand All @@ -7,6 +8,12 @@ import { ParsedPadding } from "./parsedPadding";
import { ParsedScale } from "./parsedScale";


/*
* A type specifying the padding object notation.
*/
type PaddingObject = Extract<Padding, Record<string, unknown>>;


/**
* Parses the padding to usable tuples of parsed scales.
*/
Expand Down Expand Up @@ -47,10 +54,10 @@ export function parsePadding(padding: Padding | undefined, fallbackPadding: Pars
{
// padding specified as object
returnValue = createParsed(
parseScaleOrFallback(padding.top, fallbackPadding.top),
parseScaleOrFallback(padding.right, fallbackPadding.right),
parseScaleOrFallback(padding.bottom, fallbackPadding.bottom),
parseScaleOrFallback(padding.left, fallbackPadding.left)
parsePaddingSideOrFallback(startKeys[0], padding, fallbackPadding),
parsePaddingSideOrFallback(endKeys[1], padding, fallbackPadding),
parsePaddingSideOrFallback(endKeys[0], padding, fallbackPadding),
parsePaddingSideOrFallback(startKeys[1], padding, fallbackPadding)
);
}
else
Expand All @@ -63,10 +70,20 @@ export function parsePadding(padding: Padding | undefined, fallbackPadding: Pars
}


/**
* Determines the padding for a specific side, or takes the fallback value.
*/
function parsePaddingSideOrFallback(side: keyof ParsedPadding, padding: PaddingObject, fallback: ParsedPadding): ParsedScale
{
const value = padding[side];
return parseScaleOrFallback(isUndefined(value) ? padding.rest : value, fallback[side]);
}


/**
* Create a parsed padding object.
*/
function createParsed(top: ParsedScale, right: ParsedScale, bottom: ParsedScale, left: ParsedScale): ParsedPadding
{
return { top, right, bottom, left };
}
}
16 changes: 16 additions & 0 deletions tests/positional/parsePadding.tests.ts
Original file line number Diff line number Diff line change
Expand Up @@ -94,3 +94,19 @@ test("Missing key applies fallback", t =>
t.is(area.width, 47);
t.is(area.height, 160);
});


test("Missing key applies rest value", t =>
{
const area: Rectangle = { x: 10, y: 20, width: 77, height: 200 };
const fallbackScale = parseScale(15);
const fallback = { top: fallbackScale, right: fallbackScale, bottom: fallbackScale, left: fallbackScale };

const padding: ParsedPadding = parsePadding({ left: "23px", rest: "7px" }, fallback);
setSizeWithPadding(area, defaultScale, defaultScale, padding);

t.is (area.x, 10 + 23);
t.is(area.y, 20 + 7);
t.is(area.width, 47);
t.is(area.height, 186);
});

0 comments on commit af24ab3

Please sign in to comment.