Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

디자인 아이디어 디스커션 #1

Open
kkweon opened this issue Jul 3, 2020 · 7 comments
Open

디자인 아이디어 디스커션 #1

kkweon opened this issue Jul 3, 2020 · 7 comments

Comments

@kkweon
Copy link
Member

kkweon commented Jul 3, 2020

Objective

{
    "name": "Mo Kweon",
    "some_objects": [ { "key": 123 }, { "key": 1234 } ]
}

to

message Root {
  string name = 1;
  repeated SomeObject some_objects = 2;
}

message SomeObject {
  int64 key = 1;
}

Details

Proto Message 는 다음과 같이 나타내어 질 수 있음

message {{ name }} {
  [repeated] {{ fieldType }} {{ fieldName }} = {{ fieldTag }}
}

fieldType 은 Message 형 혹은 Primitive형으로 구분됨 (이 프로젝트에서 enum과 oneof 및 기타 complex type은 제외. JSON에서 추론 불가능함.)

syntax = "proto3";

message ProtoMessage {
  string name = 1;
  repeated ProtoField fields = 2;
}

message ProtoField {
  ProtoType type = 1;
  string name = 2;
  int64 tag = 3;
  bool repeated = 4;
}

message ProtoType {
  oneof type {
    ProtoMessage proto_message = 1;
    ProtoField proto_field = 2;
  }
}

음 될까요??

parseJSONToProtoMessage:: string -> ProtoMessage
generateProtoDefinition:: ProtoMessage -> string
@TangoEnSkai
Copy link
Collaborator

parseJSONToProtoMessage 가 약간 복잡할 것 같네요.
그냥 간단히 := 가 rhs타입 추론하는걸 컨닝하면 할 수 있지 않을까 막연하게 생각을 했습니다.

generateProtoDefinition은 비교적 간단하지 않을까요?

그런데 이거 파일 넣고 막 여러번 변환 변환 변환을 반복해서 깔끔하게 잘 구현되면 좋겠네요
마치 영어 한국어 구글번역기 무한 변환 눌러도 글자 하나 안바뀌고 잘 번역/역번역 되는 것 처럼요.

@kkweon
Copy link
Member Author

kkweon commented Jul 3, 2020

note to myself

PossibleJSON values

  • a string
  • a number
  • an object (JSON object)
  • an array
  • a boolean
  • null

@kkweon
Copy link
Member Author

kkweon commented Jul 3, 2020

@TangoEnSkai
generateProtoDefinition 부탁드려도 될까요?

@kkweon
Copy link
Member Author

kkweon commented Jul 4, 2020

이제 배열만 하면 되는데 배열 => repeated 가 좀 고민이네요.
특히 repeated 내에서 값이 달라질때 대충 2개 strategy 가 있는데

  1. 머지를 하는 경우
  2. 다른 별개의 메시지로 만드는 경우

1번의 경우로 하려고 함니다.

@kkweon kkweon changed the title 디자인 디자인 아이디어 디스커션 Jul 4, 2020
@TangoEnSkai
Copy link
Collaborator

fieldType 은 Message 형 혹은 Primitive형으로 구분됨 (이 프로젝트에서 enum과 oneof 및 기타 complex type은 제외. JSON에서 추론 불가능함.)

어떻게 할지 잠깐 생각하다가 어제 잠들었는데요, 자동적으로 추론하기는 어렵겠네요.

enum은 필드명이 enum인것을 추출하면 되지 않을까 단순하게 생각했었는데 https://www.json.org/json-en.html 이걸 보니 딱히 native 로 지원하지는 않는것 같아서 추론불가능한게 맞겠네요.

@TangoEnSkai
Copy link
Collaborator

@TangoEnSkai
generateProtoDefinition 부탁드려도 될까요?

네 이부분 해 시간 나는대로 하나씩 해보겠습니다. 오는 수요일까지는 좀 바쁠 것 같긴 한데요,
가능하면 이번주 중에 첫 삽은 떠 볼 수 있도록 해보겠습니다 ㅎㅎ

@TangoEnSkai
Copy link
Collaborator

TangoEnSkai commented Jul 4, 2020

이제 배열만 하면 되는데 배열 => repeated 가 좀 고민이네요.
특히 repeated 내에서 값이 달라질때 대충 2개 strategy 가 있는데

  1. 머지를 하는 경우
  2. 다른 별개의 메시지로 만드는 경우

1번의 경우로 하려고 함니다.

repeated 내에서 값이 달라질 때

이 부분은 JSON의 배열에서 Protobuf로 변환할 때 배열내의 각 원소의 추론되는 타입이 다른 경우를 말씀하시는 건가요?
예컨데 배열에 스트링, 넘버, 불리언 이렇게 있는 경우,

  1. 하나의 메시지로서 합쳐버릴지
  2. 배열에 대한 새로운 메시지를 정의하고 그 메시지를 기존의 메시지에 가져와서 사용할 지

를 말씀하시는 걸까요?

잘 이해가 안되서 혹시 조금만 더 설명해 주실 수 있으면 감사하겠습니다.

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

No branches or pull requests

2 participants