Member-only story
I released vaporware.

Vaporware is software or hardware that has been advertised, but is not yet available to use. Obviously, releasing vaporware is not something to be proud of. Yet I managed to do so by accident. You can learn from my errors so as to not make the same mistake. So here’s how it happened and how I fixed it.
On March 1st, 2022, I set out to create Disgo, a Discord API Wrapper designed to be flexible, performant, secure, and thread-safe. Disgo aims to provide every feature in the Discord API along with optional rate limiting, structured logging, shard management, and caching… However, at that time, there was one issue: I had yet to commit a single line of code. Instead, I created a README outlining my vision for Disgo. What did I come up with?
The Design Documentation
Requests
In order to use most API Wrappers, you must learn three things.
- The Programming Language
- The API of the Consumer (Library)
- The API of the Producer (Discord)
This is because most programmers start creating libraries by using functions: Such that the function to send a message is ChannelMessage(…)
, while the function to respond to an interaction is InteractionRespond(…)
. Each function merits its own parameters, which requires you to read the documentation of the library to figure out how to do each task.
This is a huge waste of time and needlessly complex.
Disgo uses a single function to send HTTP requests (without type assertion or generics).
Send(*Client)
That’s it. Easy to remember and even easier to use. This function always maintains a single parameter: The client that the request is being sent by. However, you still need a way to specify what data is actually being sent. If you don’t use functions to do this, what’s the alternative? Structs.
// Create a Create Global Application Command request.
request := disgo.CreateGlobalApplicationCommand{
Name: "main",
Description: "A basic command.",
...
}
// Send the request.
command, err := request.Send(bot)
Each struct maintains all the data a person would need to send a valid request. That includes URL Query String…