Awesome
genprotocol - protocol 기반 코드 생성
( goguelike 프로젝트를 하면서 만들어진 ) 네트웍 등에서 사용하기 위한 protocol 을 작성하는데 필요한 반복적 이고 기계적인 코드들을 자동으로 생성 해주는 프로그램 입니다.
example folder 에서 예제를 볼 수 있습니다.
작성 이유는 하나의 프로젝트에서 여러종의 protocol 을 사용할 일이 생겨서 반복된 코드를 작성하다 보니 만들게 되었습니다.
goguelike 를 예로 들면
game client - tower server
tower server - ground server
의 2종의 protocol이 필요하고 사실상 비슷한데 조금 다른 코드들이 서로 구별 되어 쓰입니다.
사용 법
위 와 같은 경우
genprotocol -ver=1.2 -prefix=c2t -basedir=.
genprotocol -ver=1.0 -prefix=t2g -basedir=.
과 같은 형태로 실행합니다.
자동 생성된 파일은 모두 _gen.go 로 끝나는 이름을 가집니다.
인자 설명
ver : protocol의 version ( protocol 마다 버전이 다를 수 있습니다. )
prefix : 각 protocol을 구별하기 위한 prefix
basedir : protocol code가 생성될 기본 폴더, 여기서 prefix_*.enum 을 읽습니다.
example/rundriver 디렉토리
json을 serializer로 사용하는 tcp server/client, websocket server/client 예제 입니다.
genprotocol에서 읽어 들이는 파일들
인자로준 basedir 폴더내에서 찾습니다.
각 라인의 첫 단어가 enum 이고 space 로 분리된 뒷 부분은 생성된 코드의 comment가 된다.
# 으로 시작하는 라인은 무시(comment취급)
prefix_command.enum : request/response packet 용 command id 목록
prefix_noti.enum : notification packet 용 noti id 목록
prefix_error.enum : error code 목록
생성되는 go package (디렉토리)
prefix 는 genprotocol 에 prefix 인자로 준 값
생성이 끝난 코드들은 import code가 제대로 되어 있지 않으니 goimports 등으로 정리 해주어야 합니다.
-verbose 인자를 주고 실행하면 goimports 를 해야할 파일 목록을 찍어 줍니다.
example.sh 를 실행한 결과
goimports -w example/c2s_version/version_gen.go
goimports -w example/c2s_idcmd/command_gen.go
goimports -w example/c2s_idnoti/noti_gen.go
goimports -w example/c2s_error/error_gen.go
goimports -w example/c2s_const/const_gen.go
goimports -w example/c2s_packet/packet_gen.go
goimports -w example/c2s_obj/objtemplate_gen.go
goimports -w example/c2s_msgp/serialize_gen.go
goimports -w example/c2s_json/serialize_gen.go
goimports -w example/c2s_handlersp/fnobjtemplate_gen.go
goimports -w example/c2s_handlersp/fnbytestemplate_gen.go
goimports -w example/c2s_handlenoti/fnobjtemplate_gen.go
goimports -w example/c2s_handlenoti/fnbytestemplate_gen.go
goimports -w example/c2s_handlereq/fnobjtemplate_gen.go
goimports -w example/c2s_handlereq/fnbytestemplate_gen.go
goimports -w example/c2s_serveconnbyte/serveconnbyte_gen.go
goimports -w example/c2s_connbytemanager/connbytemanager_gen.go
goimports -w example/c2s_conntcp/conntcp_gen.go
goimports -w example/c2s_connwasm/connwasm_gen.go
goimports -w example/c2s_connwsgorilla/connwsgorilla_gen.go
goimports -w example/c2s_loopwsgorilla/loopwsgorilla_gen.go
goimports -w example/c2s_looptcp/looptcp_gen.go
goimports -w example/c2s_pid2rspfn/pid2rspfn_gen.go
goimports -w example/c2s_statnoti/statnoti_gen.go
goimports -w example/c2s_statcallapi/statcallapi_gen.go
goimports -w example/c2s_statserveapi/statserveapi_gen.go
goimports -w example/c2s_statapierror/statapierror_gen.go
goimports -w example/c2s_authorize/authorize_gen.go
인자로 -statstype=elementtype 이 주어진 경우 추가로 생성
goimports -w example/c2s_error_stats/c2s_error_stats_gen.go
goimports -w example/c2s_idcmd_stats/c2s_idcmd_stats_gen.go
goimports -w example/c2s_idnoti_stats/c2s_idnoti_stats_gen.go
prefix_obj : protocol struct 들 (packet body)
생성하는 파일
objtemplate_gen.go : 예제 파일 - 참고해서 "_gen"이 없는 파일을 만들것
prefix_handlereq : commandid -> api function map, 과 예제 api function들
생성하는 파일
fnbytestemplate_gen : packetbody 가 []byte 인 형태로 api로 demux, unmarshal을 api 쪽에서 해야 함
fntemplate_gen : packetbody 가 interface{} 인 형태로 api로 demux, unmarshal 후에 demux map을 호출 해야 함.
prefix_version : protocol version 정보
생성하는 파일
version_gen.go
prefix_error : protocol error code list, errorcode type은 error를 구현하고 있다.
생성하는 파일
error_gen.go
prefix_idcmd : protocol command (request,response) list
생성하는 파일
command_gen.go
prefix_idnoti : protocol notification list
생성하는 파일
noti_gen.go
prefix_const : 각종 상수들 , 설정의 변경이 가능하도록 모아둠.
생성하는 파일
const_gen.go : 복사해서 _gen 이 없는 파일을 만들고 comment를 풀어 사용할것.
prefix_packet : protocol packet( header + body )
생성하는 파일
packet_gen.go
prefix_msgp : messagepack marshal/unmarshal code (https://github.com/tinylib/msgp)
생성하는 파일
serialize_gen.go
prefix_json : json marshal/unmarshal code
생성하는 파일
serialize_gen.go
prefix_gob : gob marshal/unmarshal code
생성하는 파일
serialize_gen.go
prefix_loopwsgorilla : go server/client용 gorilla websocket Send/Recv loop (gorilla)
생성하는 파일
loopwsgorilla_gen.go
prefix_looptcp : go server/client용 TCP Send/Recv loop
생성하는 파일
looptcp_gen.go
prefix_serveconnbyte : server 용 connection api 처리 (tcp, websocket) packet body []byte 형태
생성하는 파일
serveconnbyte_gen.go
prefix_connbytemanager : server 용 connection manager, server에 연결된 connection(prefix_serveconnbyte) 을 관리한다.
생성하는 파일
connbytemanager_gen.go
prefix_connwasm : websocket wasm client 용 connection
생성하는 파일
connwasm_gen.go
prefix_connwsgorilla : gorilla websocket client 용 connection
생성하는 파일
connwsgorilla_gen.go
prefix_conntcp : tcp client 용 connection
생성하는 파일
conntcp_gen.go
prefix_handlersp : response 를 받아서 처리
생성하는 파일
recvrspobjfnmap_gen.go : 받은 response 처리
prefix_handlenoti : notification을 받아서 처리
생성하는 파일
recvnotiobjfnmap_gen.go : 받은 notification 처리
prefix_pid2rspfn : callback 형태로 request/response를 처리하기위한 lib(client example참조)
생성하는 파일
pid2rspfn_gen.go
prefix_statnoti : notification protocol 통계
생성하는 파일
statnoti_gen.go
prefix_statcallapi : client api call 통계
생성하는 파일
statcallapi_gen.go
prefix_statserveapi : server api 처리 통계
생성하는 파일
statserveapi_gen.go
prefix_statapierror : api 결과 error 통계
생성하는 파일
statapierror_gen.go
prefix_authorize : client api call의 권한 관리 (commandid 기준)
생성하는 파일
authorize_gen.go
인자로 -statstype=elementtype 이 주어진 경우 추가로 생성하는 패키지
prefix_error_stats : elementtype을 구성요소로한 simple errorcode 통계 (genenum에서 가져옴)
생성하는 파일
prefix_error_stats_gen.go
prefix_idcmd_stats : elementtype을 구성요소로한 simple commandid 통계 (genenum에서 가져옴)
생성하는 파일
prefix_idcmd_stats_gen.go
prefix_idnoti_stats : elementtype을 구성요소로한 simple notiid 통계 (genenum에서 가져옴)
생성하는 파일
prefix_idnoti_stats_gen.go
websocket 을 사용하려면
go get github.com/gorilla/websocket