yamldecode 함수

yamldecode 함수

yamldecode는 문자열을 YAML의 부분 집합으로 파싱해서 그 값의 표현을 만들어 주는 함수예요. YAML 데이터를 Packer 값으로 바꿀 때 사용합니다.

출처: Packer 공식 문서

본문

yamldecode는 문자열을 YAML의 부분 집합으로 파싱하고, 그 값의 표현을 생성합니다.

이 함수는 아래에 설명된 대로 YAML 1.2의 부분 집합을 지원해요.

이 함수는 YAML 값을 다음과 같은 방식으로 Packer 언어 값에 매핑합니다.

YAML type Packer type
!!str string
!!float number
!!int number
!!bool bool
!!map object(...) with attribute types determined per this table
!!seq tuple(...) with element types determined per this table
!!null The Packer language null value
!!timestamp string in RFC 3339 format
!!binary string containing base64-encoded representation

Packer 언어의 자동 타입 변환 규칙 덕분에, 보통은 특정 값에 대해 정확히 어떤 타입이 생성되는지 신경 쓸 필요 없이 결과를 직관적으로 사용하면 돼요.

다만 위 매핑은 여러 소스 타입이 같은 대상 타입으로 매핑되기 때문에 모호하다는 점을 유의하세요. 그래서 yamldecode를 거친 다음 yamlencode로 되돌리는 왕복(round-trip)은 동일한 결과를 만들 수 없습니다.

YAML은 복잡한 언어이고, Packer 언어의 타입 시스템이 표현할 수 없는 여러 가능성을 지원해요. 그래서 이 YAML 디코더는 YAML 1.2의 부분 집합만 지원하며, 다음과 같은 제한이 있습니다.

  • 이전 앵커(anchor)에 대한 별칭(alias)은 지원되지만, 컬렉션 내부에 그 컬렉션 자신에 대한 참조가 나타나는 순환 데이터 구조(cyclic data structure)는 지원되지 않아요. yamldecode가 그런 구조를 감지하면 오류를 반환합니다.
  • 위 표에 나온 타입 태그(또는 그와 동등한 대체 표현)만 지원됩니다. 다른 태그는 오류를 발생시켜요.
  • YAML 문서는 하나만 허용됩니다. 주어진 문자열에 여러 문서가 있으면 이 함수는 오류를 반환해요.

Examples

> yamldecode("{\"hello\": \"world\"}")
{
  "hello" = "world"
}
> yamldecode("true")
true
> yamldecode("{a: &foo [1, 2, 3], b: *foo}")
{
  "a" = [
    1,
    2,
    3,
  ]
  "b" = [
    1,
    2,
    3,
  ]
}
> yamldecode("{a: &foo [1, *foo, 3]}")
Error: Error in function call
Call to function "yamldecode" failed: cannot refer to anchor "foo" from inside
its own definition.
> yamldecode("{a: !not-supported foo}")
Error: Error in function call
Call to function "yamldecode" failed: unsupported tag "!not-supported".

더 알아보기 (Learn more)

  • jsondecode는 YAML 대신 JSON을 사용한다는 점만 다르고 비슷한 작업을 수행해요.
  • yamlencode는 그 반대 작업을 수행해서 값을 YAML로 인코딩해 줘요.