Skip to content

OXY-149: separate Integer JsonType (json + schema) - #294

Merged
Kalin-Rudnicki merged 1 commit into
mainfrom
OXY-149
Aug 15, 2026
Merged

OXY-149: separate Integer JsonType (json + schema)#294
Kalin-Rudnicki merged 1 commit into
mainfrom
OXY-149

Conversation

@Kalin-Rudnicki

Copy link
Copy Markdown
Owner

What

Splits the monolithic Json.Type.Number into distinct Integer vs Number discriminants so oxygen-json and oxygen-schema can tell 123 (integer) from 1.5 (number) at the type level, matching JSON Schema 2020-12 / OpenAPI.

Changes

  • Json.scala: add Json.Type.Integer; Json.tpe classifies Json.Number via BigDecimal.isWhole. No new AST node — kept the single Json.Number(BigDecimal), so all existing case _: Json.Number / Json.Number(v) pattern matches keep working (fully backwards compatible).
  • JsonSchemaEmitter.astSchema: emit {"type":"integer"} for Json.Type.Integer.
  • Compared.diffJsonAST: integer→number = widening (FromIsMoreSpecific), number→integer = breaking (ToIsMoreSpecific); typed-number vs AST-integer made consistent.
  • Parser / decoders / encoders: unchanged (parser still emits Json.Number; JsonDecoder[Int] already rejects fractional via round-trip narrowing).

Key decisions

Classification is by numeric value (isWhole): 1.0, 1e+3, 0.000Integer; 1.5, 1e-3Number. Schema uses bare integer (no int32). Full rationale + all resolved open questions in report/OXY-149.md.

Tests

utJVM/testOnly oxygen.json.* oxygen.schema.*107 passed, 0 failed, including new: parse("123").tpe == Integer, parse("1.5").tpe == Number, JsonDecoder[Int] rejects 1.5, JsonSchema[Int] emits integer, JsonSchema[Double] emits number.

Confidence: 8.5/10

json + schema compile clean and their full test suites pass; changes are additive/non-breaking. Residual risk: full monorepo not built (additive change, low risk); Compared widening/breaking semantics verified by reading (CompatSpec is a print-only placeholder, not an assertive test).

🤖 Generated with Claude Code

Comment thread report/OXY-149.md Outdated
Split Json.Type.Number into distinct Integer vs Number discriminants so
oxygen-json and oxygen-schema can tell 123 (integer) from 1.5 (number) at
the type level, matching JSON Schema 2020-12 / OpenAPI.

- Json.scala: add Json.Type.Integer; Json.tpe classifies Json.Number via
  BigDecimal.isWhole. No new AST node -- existing case _: Json.Number /
  Json.Number(v) matches keep working (fully backwards compatible).
- JsonSchemaEmitter.astSchema: emit {"type":"integer"} for Type.Integer.
- Compared.diffJsonAST: integer->number widening (FromIsMoreSpecific),
  number->integer breaking (ToIsMoreSpecific); typed-number vs AST-integer
  made consistent.
- Parser / decoders / encoders: unchanged.

Classification is by numeric value: 1.0, 1e+3, 0.000 -> Integer; 1.5,
1e-3 -> Number. Schema uses bare integer (no int32).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@Kalin-Rudnicki
Kalin-Rudnicki merged commit 732e8b9 into main Aug 15, 2026
7 checks passed
@Kalin-Rudnicki
Kalin-Rudnicki deleted the OXY-149 branch August 15, 2026 01:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant