From 41e7a5b28bdc65c77b22785ee2e013adfe96f7c2 Mon Sep 17 00:00:00 2001 From: Sunny Klair <295551+sunhay@users.noreply.github.com> Date: Mon, 13 Jul 2020 09:05:04 -0400 Subject: [PATCH] Add static checks to help ensure implementations conform to interfaces (#582) --- d2common/bitmuncher.go | 2 ++ d2common/bitstream.go | 8 +++++++- d2common/cache.go | 2 ++ d2common/d2fileformats/d2mpq/mpq.go | 5 ++++- d2common/d2fileformats/d2mpq/mpq_data_stream.go | 4 ++++ d2core/d2asset/animation_manager.go | 9 ++++++--- d2core/d2asset/archive_manager.go | 4 ++++ d2core/d2asset/archived_file_manager.go | 4 ++++ d2core/d2asset/dc6_animation.go | 4 +++- d2core/d2asset/dcc_animation.go | 4 +++- d2core/d2asset/font.go | 5 +++-- d2core/d2asset/font_manager.go | 6 +++++- d2core/d2asset/palette_manager.go | 4 ++++ d2core/d2audio/ebiten/ebiten_audio_provider.go | 5 +++-- d2core/d2input/input_events.go | 8 ++++++++ 15 files changed, 62 insertions(+), 12 deletions(-) diff --git a/d2common/bitmuncher.go b/d2common/bitmuncher.go index 48900745..e46fefde 100644 --- a/d2common/bitmuncher.go +++ b/d2common/bitmuncher.go @@ -2,6 +2,8 @@ package d2common import "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" +var _ d2interface.BitMuncher = &BitMuncher{} // Static check to confirm struct conforms to interface + // BitMuncher is used for parsing files that are not byte-aligned such as the DCC files. type BitMuncher struct { data []byte diff --git a/d2common/bitstream.go b/d2common/bitstream.go index c020aa1a..d7e7f562 100644 --- a/d2common/bitstream.go +++ b/d2common/bitstream.go @@ -1,6 +1,12 @@ package d2common -import "log" +import ( + "log" + + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" +) + +var _ d2interface.BitStream = &BitStream{} // Static check to confirm struct conforms to interface // BitStream is a utility class for reading groups of bits from a stream type BitStream struct { diff --git a/d2common/cache.go b/d2common/cache.go index a534ed1e..5293cc86 100644 --- a/d2common/cache.go +++ b/d2common/cache.go @@ -8,6 +8,8 @@ import ( "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" ) +var _ d2interface.Cache = &Cache{} // Static check to confirm struct conforms to interface + type cacheNode struct { next *cacheNode prev *cacheNode diff --git a/d2common/d2fileformats/d2mpq/mpq.go b/d2common/d2fileformats/d2mpq/mpq.go index 8cf76327..c56d7b2b 100644 --- a/d2common/d2fileformats/d2mpq/mpq.go +++ b/d2common/d2fileformats/d2mpq/mpq.go @@ -4,7 +4,6 @@ import ( "bufio" "encoding/binary" "errors" - "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" "io/ioutil" "log" "os" @@ -12,8 +11,12 @@ import ( "path/filepath" "runtime" "strings" + + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" ) +var _ d2interface.Archive = &MPQ{} // Static check to confirm struct conforms to interface + // MPQ represents an MPQ archive type MPQ struct { filePath string diff --git a/d2common/d2fileformats/d2mpq/mpq_data_stream.go b/d2common/d2fileformats/d2mpq/mpq_data_stream.go index 66d73f6d..ddbab1e4 100644 --- a/d2common/d2fileformats/d2mpq/mpq_data_stream.go +++ b/d2common/d2fileformats/d2mpq/mpq_data_stream.go @@ -1,5 +1,9 @@ package d2mpq +import "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" + +var _ d2interface.ArchiveDataStream = &MpqDataStream{} // Static check to confirm struct conforms to interface + // MpqDataStream represents a stream for MPQ data. type MpqDataStream struct { stream *Stream diff --git a/d2core/d2asset/animation_manager.go b/d2core/d2asset/animation_manager.go index 15b51904..6a770c72 100644 --- a/d2core/d2asset/animation_manager.go +++ b/d2core/d2asset/animation_manager.go @@ -5,16 +5,19 @@ import ( "path/filepath" "strings" + "github.com/OpenDiablo2/OpenDiablo2/d2common" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" - - "github.com/OpenDiablo2/OpenDiablo2/d2common" ) const ( animationBudget = 64 ) +// Static checks to confirm struct conforms to interface +var _ d2interface.ArchivedAnimationManager = &animationManager{} +var _ d2interface.Cacher = &animationManager{} + type animationManager struct { cache d2interface.Cache renderer d2interface.Renderer @@ -37,7 +40,7 @@ func createAnimationManager(renderer d2interface.Renderer) *animationManager { func (am *animationManager) LoadAnimation( animationPath, palettePath string, - effect d2enum.DrawEffect ) (d2interface.Animation, error) { + effect d2enum.DrawEffect) (d2interface.Animation, error) { cachePath := fmt.Sprintf("%s;%s;%d", animationPath, palettePath, effect) if animation, found := am.cache.Retrieve(cachePath); found { return animation.(d2interface.Animation).Clone(), nil diff --git a/d2core/d2asset/archive_manager.go b/d2core/d2asset/archive_manager.go index 039d1085..cbbea321 100644 --- a/d2core/d2asset/archive_manager.go +++ b/d2core/d2asset/archive_manager.go @@ -11,6 +11,10 @@ import ( "github.com/OpenDiablo2/OpenDiablo2/d2core/d2config" ) +// Static checks to confirm struct conforms to interface +var _ d2interface.ArchiveManager = &archiveManager{} +var _ d2interface.Cacher = &archiveManager{} + type archiveManager struct { cache d2interface.Cache config *d2config.Configuration diff --git a/d2core/d2asset/archived_file_manager.go b/d2core/d2asset/archived_file_manager.go index fded9517..0ad300c4 100644 --- a/d2core/d2asset/archived_file_manager.go +++ b/d2core/d2asset/archived_file_manager.go @@ -13,6 +13,10 @@ const ( fileBudget = 1024 * 1024 * 32 ) +// Static checks to confirm struct conforms to interface +var _ d2interface.ArchivedFileManager = &fileManager{} +var _ d2interface.Cacher = &fileManager{} + type fileManager struct { cache d2interface.Cache archiveManager d2interface.ArchiveManager diff --git a/d2core/d2asset/dc6_animation.go b/d2core/d2asset/dc6_animation.go index 76be487f..1b54932a 100644 --- a/d2core/d2asset/dc6_animation.go +++ b/d2core/d2asset/dc6_animation.go @@ -2,12 +2,14 @@ package d2asset import ( "errors" - "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2fileformats/d2dcc" d2iface "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" ) +var _ d2iface.Animation = &DC6Animation{} // Static check to confirm struct conforms to interface + // DC6Animation is an animation made from a DC6 file type DC6Animation struct { animation diff --git a/d2core/d2asset/dcc_animation.go b/d2core/d2asset/dcc_animation.go index a910daa7..74925282 100644 --- a/d2core/d2asset/dcc_animation.go +++ b/d2core/d2asset/dcc_animation.go @@ -11,7 +11,9 @@ import ( d2iface "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" ) -// DCCAnimation represens an animation decoded from DCC +var _ d2iface.Animation = &DCCAnimation{} // Static check to confirm struct conforms to interface + +// DCCAnimation represents an animation decoded from DCC type DCCAnimation struct { animation dccPath string diff --git a/d2core/d2asset/font.go b/d2core/d2asset/font.go index cc0e5704..734b8670 100644 --- a/d2core/d2asset/font.go +++ b/d2core/d2asset/font.go @@ -6,11 +6,12 @@ import ( "image/color" "strings" - "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" - "github.com/OpenDiablo2/OpenDiablo2/d2common" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" ) +var _ d2interface.Font = &Font{} // Static check to confirm struct conforms to interface + type fontGlyph struct { frame int width int diff --git a/d2core/d2asset/font_manager.go b/d2core/d2asset/font_manager.go index 21530ebb..cd5dfa77 100644 --- a/d2core/d2asset/font_manager.go +++ b/d2core/d2asset/font_manager.go @@ -2,15 +2,19 @@ package d2asset import ( "fmt" - "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" "github.com/OpenDiablo2/OpenDiablo2/d2common" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" ) const ( fontBudget = 64 ) +// Static checks to confirm struct conforms to interface +var _ d2interface.ArchivedFontManager = &fontManager{} +var _ d2interface.Cacher = &fontManager{} + type fontManager struct { cache d2interface.Cache } diff --git a/d2core/d2asset/palette_manager.go b/d2core/d2asset/palette_manager.go index 1145c9a4..a67a3e7a 100644 --- a/d2core/d2asset/palette_manager.go +++ b/d2core/d2asset/palette_manager.go @@ -6,6 +6,10 @@ import ( "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" ) +// Static checks to confirm struct conforms to interface +var _ d2interface.ArchivedPaletteManager = &paletteManager{} +var _ d2interface.Cacher = &paletteManager{} + type paletteManager struct { cache d2interface.Cache } diff --git a/d2core/d2audio/ebiten/ebiten_audio_provider.go b/d2core/d2audio/ebiten/ebiten_audio_provider.go index 323e92f3..1351b581 100644 --- a/d2core/d2audio/ebiten/ebiten_audio_provider.go +++ b/d2core/d2audio/ebiten/ebiten_audio_provider.go @@ -5,15 +5,16 @@ import ( "log" "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" - "github.com/OpenDiablo2/OpenDiablo2/d2core/d2asset" - "github.com/hajimehoshi/ebiten/audio/wav" "github.com/hajimehoshi/ebiten/audio" + "github.com/hajimehoshi/ebiten/audio/wav" ) const sampleRate = 44100 +var _ d2interface.AudioProvider = &AudioProvider{} // Static check to confirm struct conforms to interface + // AudioProvider represents a provider capable of playing audio type AudioProvider struct { audioContext *audio.Context // The Audio context diff --git a/d2core/d2input/input_events.go b/d2core/d2input/input_events.go index 9e4ffc70..c6389d20 100644 --- a/d2core/d2input/input_events.go +++ b/d2core/d2input/input_events.go @@ -2,8 +2,16 @@ package d2input import ( "github.com/OpenDiablo2/OpenDiablo2/d2common/d2enum" + "github.com/OpenDiablo2/OpenDiablo2/d2common/d2interface" ) +// Static checks to confirm struct conforms to interface +var _ d2interface.InputEventHandler = &HandlerEvent{} +var _ d2interface.KeyEvent = &KeyEvent{} +var _ d2interface.KeyCharsEvent = &KeyCharsEvent{} +var _ d2interface.MouseEvent = &MouseEvent{} +var _ d2interface.MouseMoveEvent = &MouseMoveEvent{} + // HandlerEvent is an event that EventHandlers will process and respond to type HandlerEvent struct { keyMod d2enum.KeyMod