Skip to content
This repository was archived by the owner on Dec 24, 2023. It is now read-only.
This repository was archived by the owner on Dec 24, 2023. It is now read-only.

Role of code generation in OSHI 5 #4

Description

@cilki

About 5 months ago I wrote a small program with JavaPoet that generates the API according to a set of general definitions.

For example, the following YAML file defines a small Nic component:

- Nic:
  - name: The interface's name
      type: String
  - mtu: The interface's maximum transmission unit
      type: Integer
  - ipv4: The interface's IPv4 addresses
      type: String[]
  - luid: The interface's local UID
      type: Long
      platforms: windows
  - guid: The interface's global UID
      type: String
      platforms: windows
  - connected: Whether the interface is connected
      type: Boolean
      platforms: windows
...

The program produced the API component and the interface for the driver (which I call the Index) along with proper JavaDoc on everything. I'm confident that JavaPoet can generate just about any kind of API we come up with, so the question is whether it's a good fit for the project.

Advantages to generating the API

  • Generate hundreds of source files in seconds
  • Places the essence of OSHI into a single definition file
    • Makes it easier to produce a uniform/consistent API
    • Makes it easier and less error-prone to add/change features
  • Changes to the API itself can be propagated quickly and error-free
  • Allows us to relax on DRY if doing so leads to a better API
  • No additional runtime dependencies and integrates well with Maven

Disadvantages to generating the API

  • Flexibility to add special cases to the API is lost
    • Doing so goes against one of our design goals, but could be permissible once or twice
    • This means that the API we come up with must be general enough to suit every feature
  • Another piece of code to write and maintain

I'll update this post with any additional concerns.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions